Recyclerview使用Glide复制图像

时间:2016-09-10 03:04:47

标签: android image android-recyclerview android-cardview android-glide

我使用Recyclerview和Glide实现列表以异步加载图像。发生的事情是每次卡片被回收时,在图像完全加载之前,滑行图像响应将转到另一张卡片视图。结果我们看到在列表上复制图像。我尝试了很多方法,但我还是遇到了这个问题。我真的感谢任何答案帮助我解决它。

这是我的简化代码:

public class RVAdapter extends RecyclerView.Adapter<RVAdapter.ZueiraViewHolder> {

    public static ArrayList<Zueira> zueiras;
    public Context context;
    private static final int IMAGE_WIDTH = 400;
    private static final int IMAGE_HEIGHT = 600;

    public RVAdapter(ArrayList<Zueira> zueiras, Context context) {
        this.zueiras = zueiras;
        this.context = context;
    }

    @Override
    public void onBindViewHolder(ZueiraViewHolder holder, int position) {

        // set description
        holder.zueira_description.setText(zueiras.get(position).getDescription());

        // THIS THING IS ASYNC!
        // I think when I scroll too fast, since it's async, the response may be
        // coming late because that card was already recycled
        Glide.with(context)
            .load(zueiras.get(position).getUrl())
            .asBitmap()
            .into(new SimpleTarget<Bitmap>(IMAGE_WIDTH, IMAGE_HEIGHT) {
                @Override
                public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {

                    // set image bitmap
                    holder.zueira_image.setImageBitmap(resource);

                    // some click listener
                    holder.zueira_image.setOnClickListener(new View.OnClickListener() {
                        @Override
                        public void onClick(View view) {

                            // some logic goes here after the image is completely loaded

                        }
                    });

                }

                @Override
                public void onLoadFailed(Exception e, Drawable errorDrawable) {
                    super.onLoadFailed(e, errorDrawable);
                }
            });
    }

    @Override
    public ZueiraViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.custom_row, viewGroup, false);
        ZueiraViewHolder pvh = new ZueiraViewHolder(v);
        return pvh;
    }

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

    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

    public static class ZueiraViewHolder extends RecyclerView.ViewHolder {

        CardView cv;
        public ImageView zueira_image;
        public TextView zueira_description;

        ZueiraViewHolder(View itemView) {
            super(itemView);

            cv = (CardView) itemView.findViewById(R.id.cv);
            zueira_image = (ImageView) itemView.findViewById(R.id.zueira_image);
            zueira_description = (TextView) itemView.findViewById(R.id.zueira_description);

        }
    }

}

感谢。

1 个答案:

答案 0 :(得分:0)

试试这个


.diskCacheStrategy(DiskCacheStrategy.NONE) // no point in caching because it's saved to a File anyway
.skipMemoryCache(true) // make sure to re-read if original image changed