调色板 API 不工作(仅在调试时工作)

Palette API not working (Works only when I'm debugging)

我在其中创建了一个简单的 RecyclerView 和一个 CardView。在CardView中有ImageViewTextView。所以我得到图像的 url 并使用 Picasso 加载它。使用 Palette API 之前一切正常。所以我想从图像中获取颜色并将其设置为 CardViewTextView.

这是我的 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());
                }
            });
        }
    }
}

每次显示占位符图像。当我进行调试时,它可以工作。所以有什么问题?

所以问题不在 Palette API。问题是目标是垃圾 collected.So 解决方案是在对象上实现它或将其存储在字段中并将其设置为我们 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);
}

我想有一天这会对任何人有所帮助)))谢谢