RecyclerView中的android ImageView以随机位置加载相同的图像

时间:2016-08-08 11:03:16

标签: android android-recyclerview

我正在使用的RecyclerView最初有一个带背景的imageView作为空心图像。触摸它时应该更改为fillheart图像。我使用RecyclerViewAdapter的getAdapterPosition()将这些检查位置添加到ArrayList,如果arraylist包含触摸,同样删除它position.but当我滚动它时,ImageView的背景会随机变换。

RecyclerAdapter:

public class ShopOfferRecycAdapter extends RecyclerView.Adapter<ShopOfferRecycAdapter.ShopOfferHolder> {
    View view;int counter=0;ArrayList checkeditems;
    @Override
    public ShopOfferHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        view= LayoutInflater.from(parent.getContext()).inflate(R.layout.shop_offers_recycler_adapter,parent,false);
        return new ShopOfferHolder(view);
    }

    @Override
    public void onBindViewHolder(ShopOfferHolder holder, int position) {
        DisplayImageOptions options = new DisplayImageOptions.Builder().showImageOnLoading(R.drawable.mobile)
                .showImageForEmptyUri(R.drawable.mobile).showImageOnFail(R.drawable.mobile).cacheInMemory(true).cacheOnDisk(true)
                .considerExifParams(true).bitmapConfig(Bitmap.Config.RGB_565).build();
        ImageLoader.getInstance().displayImage("http://dress-trends.com/wp-content/uploads/2015/10/Fashion-clothing-for-men-spring-summer-2016-61.jpg",holder.imageView,options);
    }

    @Override
    public int getItemCount() {
        return 10;
    }

    public class ShopOfferHolder extends RecyclerView.ViewHolder{
        ImageView imageView,fav;
        public ShopOfferHolder(View itemView) {
            super(itemView);
            checkeditems=new ArrayList();
            imageView=(ImageView) itemView.findViewById(R.id.product_img);
            fav=(ImageView) itemView.findViewById(R.id.fav);
            fav.setOnTouchListener(new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
       if(checkeditems.size()>0&&checkeditems.contains(getAdapterPosition()+1)==true) {
                        checkeditems.remove(getAdapterPosition()+1);
                        fav.setImageResource(R.drawable.heartnofill);
                        Log.e("Position removed", Integer.toString(getAdapterPosition()+1));
                    }
                        else if(checkeditems.contains(getAdapterPosition())==false){
                        fav.setImageResource(R.drawable.heartfill);
                        checkeditems.add(getAdapterPosition()+1);
                        Log.e("Pos added",Integer.toString(getAdapterPosition()+1));
//                        if(checkeditems.contains(getAdapterPosition()){
//                            checkeditems.remove(getAdapterPosition());
//                            Log.e("Position removed",Integer.toString(getAdapterPosition()));
                        }
                            return false;

                }

            });
        }
    }
}

2 个答案:

答案 0 :(得分:2)

onBindViewHolder中,您将图片加载到ImageView这样使用holder.imageView.setImageBitmap(null)。这将重置ImageView并立即刷新以前使用的Image。

holder.imageView.setImageBitmap(null);
ImageLoader.getInstance().displayImage("http://dress-trends.com/wp-content/uploads/2015/10/Fashion-clothing-for-men-spring-summer-2016-61.jpg",holder.imageView,options);

答案 1 :(得分:1)

在你的onBindViewHolder方法中试试这个

holder.setIsRecyclable(false);

正如您可以通过该方法的名称理解的那样,这将告诉您的回收者视图停止回收您的视图持有者。

  

在某些情况下,这可能会导致性能问题

但是看看上面代码片段中的getCount方法,你似乎有更少的元素要处理:)