API палитры не работает (работает только при отладке)

Я создал простой RecyclerView и CardView в этом. В CardView имеются ImageView а также TextView, Таким образом, я получаю URL изображения и загружаю его, используя Picasso, Все хорошо работало перед использованием Palette API, Поэтому я хочу получить цвет из изображения и установить его CardView а также TextView,

Вот мой RecyclerView.Adapter

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.MyViewHolder> {

private List<String> imagesUrl;
private List<String> imageDescription;

RecyclerAdapter(List<String> imagesUrl, List<String> imageDescription) {
    this.imagesUrl = imagesUrl;
    this.imageDescription = imageDescription;
}

@NonNull
@Override
public MyViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int position) {
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item, viewGroup, false);
    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int position) {
    myViewHolder.textView.setText(imageDescription.get(position));
    Picasso.get()
            .load(imagesUrl.get(position))
            .into(new Target() {
                @Override
                public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
                    myViewHolder.imageView.setImageBitmap(bitmap);
                    myViewHolder.getPalette();
                }

                @Override
                public void onBitmapFailed(Exception e, Drawable errorDrawable) {
                    myViewHolder.imageView.setImageResource(R.drawable.error);
                }

                @Override
                public void onPrepareLoad(Drawable placeHolderDrawable) {
                    myViewHolder.imageView.setImageResource(R.drawable.placeholder);
                }
            });
}

@Override
public int getItemCount() {
    return imagesUrl.size();
}

class MyViewHolder extends RecyclerView.ViewHolder {

    private ImageView imageView;
    private TextView textView;
    private CardView cardView;

    MyViewHolder(@NonNull View itemView) {
        super(itemView);
        imageView = itemView.findViewById(R.id.imageView);
        textView = itemView.findViewById(R.id.textView);
        cardView = itemView.findViewById(R.id.cardView);
    }

    private void getPalette() {
        Bitmap bitmap = ((BitmapDrawable)imageView.getDrawable()).getBitmap();
        Palette.from(bitmap).generate(new Palette.PaletteAsyncListener() {
            @Override
            public void onGenerated(@Nullable Palette palette) {
                //assert palette != null;
                Palette.Swatch swatch = palette.getVibrantSwatch();
                //assert swatch != null;
                textView.setTextColor(swatch.getBodyTextColor());
                cardView.setCardBackgroundColor(swatch.getRgb());
            }
        });
    }
}
}

Каждый раз, когда он показывает изображение заполнителя. Когда я делаю отладку, это работает. Так в чем проблема? Спасибо.

1 ответ

Решение

Так что проблема не в Palette API, Проблема в том, что цель - сборщик мусора. Поэтому решение состоит в том, чтобы реализовать его на объекте или сохранить в поле и установить в качестве тега для нашего ImageView,

Вот. Это сейчас работает.

@Override
public void onBindViewHolder(@NonNull final MyViewHolder myViewHolder, int position) {
    myViewHolder.textView.setText(imageDescription.get(position));
    Target target = new Target() {
        @Override
        public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
            myViewHolder.imageView.setImageBitmap(bitmap);
            myViewHolder.getPalette();
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            myViewHolder.imageView.setImageResource(R.drawable.error);
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {
            myViewHolder.imageView.setImageResource(R.drawable.placeholder);
        }
    };

    Picasso.with(context)
            .load(imagesUrl.get(position))
            .into(target);

    myViewHolder.imageView.setTag(target);
}

Думаю, это когда-нибудь кому-нибудь поможет))) Спасибо

Другие вопросы по тегам