0

我在其中创建了一个简单的RecyclerView和一个CardViewCardView里面有ImageViewTextView。所以我得到了图像的 url 并使用Picasso. 使用前一切正常Palette API。所以我想从图像中获取颜色并将其设置为CardViewand 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());
                }
            });
        }
    }
}

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

4

1 回答 1

0

所以问题不在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);
}

我认为这有一天会帮助任何人)))谢谢

于 2019-02-16T20:05:31.517 回答