滚动时如何防止重复“RecyclerView”?

问题描述 投票:0回答:3

我在我的RecyclerView上展示了一个爱情标志。当用户点击时,爱情标志的颜色从默认灰色变为红色,但是当我滚动时,它在其他一些位置显示颜色(未点击)。点击的颜色也变为灰色。

我找到了大量的解决方案,但对我没什么用。请帮忙。我给你我的代码

特色产品类

public class FeaturedlistAdapter extends RecyclerView.Adapter<FeaturedlistAdapter.FeaturedView>
{
    private Context context;
    private List<Featured_data> featured_data;

    public FeaturedlistAdapter(Context context, List<Featured_data> featured_data,MyAdapterListener  myAdapterListener) {
        this.context=context;
        this.featured_data=featured_data;
        this.onclickListener=myAdapterListener;

    }

@NonNull
@Override
public FeaturedView onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view = LayoutInflater.from(context).inflate(R.layout.list_allbrands, viewGroup, false);
    return new FeaturedView(view);
}

@Override
public void onBindViewHolder(@NonNull FeaturedView featuredView, int i) {

    String price = featured_data.get(i).getProductPrice();
    String name = featured_data.get(i).getProductName();
    String quantity = featured_data.get(i).getProductQty();
    featuredView.getTxt_brandname().setText(featured_data.get(i).getProductName());
    String wishlist=featured_data.get(i).getWishlist();
    Picasso.get().load(HomeConstants.BASE_URL + featured_data.get(i).getProductImage()).placeholder(R.drawable.whitebackground).into(featuredView.img_brand);
    if (price != null && !price.equals("")) {
        String total_price = price + " Rs";
        featuredView.getTxt_brand_price().setText(total_price);
    }
    if (quantity != null && !quantity.equals("")) {
        String total_quantity = quantity + " Items";
        featuredView.getTxt_brand_item().setText(total_quantity);
    }
    if(wishlist!=null)
    {
        if(wishlist.equals("0"))
        {
            featuredView.img_wishlist.setColorFilter(Color.argb(255, 211, 211, 211));
            featuredView.txt_count.setText("0");
        }
        else if(wishlist.equals("1"))
        {
            featuredView.img_wishlist.setColorFilter(Color.argb(255,255,0,0));
            featuredView.txt_count.setText("1");
        }
    }
    else
    {
        featuredView.img_wishlist.setColorFilter(Color.argb(255, 211, 211, 211));
        featuredView.txt_count.setText("0");
    }

}

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


@Override
public long getItemId(int position) {
    return super.getItemId(position);
}

@Override
public int getItemViewType(int position) {
    return super.getItemViewType(position);
}

class FeaturedView extends RecyclerView.ViewHolder {
    ImageView img_brand,img_wishlist;
    TextView txt_brandname,txt_brand_price,txt_brand_item,txt_count;

    public ImageView getImg_brand() {
        return img_brand;
    }

    public ImageView getImg_wishlist() {
        return img_wishlist;
    }

    public TextView getTxt_brandname() {
        return txt_brandname;
    }

    public TextView getTxt_brand_price() {
        return txt_brand_price;
    }

    public TextView getTxt_brand_item() {
        return txt_brand_item;
    }

    public TextView getTxt_count() {
        return txt_count;
    }

    FeaturedView(@NonNull View itemView) {
        super(itemView);
        img_brand=itemView.findViewById(R.id.img_brand);
        img_wishlist=itemView.findViewById(R.id.img_wishlist);
        txt_brandname=itemView.findViewById(R.id.txt_brandname);
        txt_brand_price=itemView.findViewById(R.id.txt_brand_price);
        txt_brand_item=itemView.findViewById(R.id.txt_brand_item);
        txt_count=itemView.findViewById(R.id.txt_count);
        img_wishlist.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                String value = txt_count.getText().toString();
                if (value.equals("0")) {
                    img_wishlist.setColorFilter(Color.argb(255, 255, 0, 0));
                    txt_count.setText("1");

                } else if (value.equals("1")) {
                    img_wishlist.setColorFilter(Color.argb(255, 211, 211, 211));
                    txt_count.setText("0");

                }
                onclickListener.wishlistOnclick(v,getAdapterPosition());
            }
        });
        img_brand.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onclickListener.brandOnClick(v,getAdapterPosition());
            }
        });
    }
}

private MyAdapterListener onclickListener;

public interface MyAdapterListener
{
    void wishlistOnclick(View view ,int position);
    void brandOnClick(View view,int position);
}
}
java android android-recyclerview recycler-adapter
3个回答
0
投票

您需要使用SparseBooleanArray保持视图的状态。这是因为在RecylerView中,项目将显示前一个视图(如果存在),即视图将在使用前首先被回收。因此,RecyclerView的意思。

你可以这样做:

首先,在你的Adapter中,添加SparseBooleanArray来保存标志(请阅读代码中的注释):

public class FeaturedlistAdapter extends RecyclerView.Adapter<FeaturedlistAdapter.FeaturedView>
{
    private Context context;
    private List<Featured_data> featuredData;
    private SparseBooleanArray mSelectedFlags;

    public FeaturedlistAdapter(Context context, List<Featured_data> featured_data,MyAdapterListener  myAdapterListener) {
        ...

        // init the flag
        mSparseBooleanArray = new SparseBooleanArray();

    }

    @Override
    public void onBindViewHolder(@NonNull FeaturedView featuredView, int i) {
       int position = featuredView.getAdapterPosition();
       Featured_data data = featuredData.get(position);

       // reset the state of the view each time the 
       // view get recycled by applying the flag.
       if(mSelectedFlags.get(position)) {
          // set the selected state, i.e red
       } else {
          // SparseBooleanArray.get(i) is false if not found
          // set the unselected state, i.e grey
       }
}

然后在你的ViewHolder中,设置单击/选择成员视图时的状态:

class FeaturedView extends RecyclerView.ViewHolder {

    ...

    FeaturedView(@NonNull View itemView) {
        ...
        img_wishlist.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
              ...
              // save the selected state
              mSparseBooleanArray.put(getAdapterPosition(), true);

            }
         ...
    }
}

现在,将使用SparseBooleanArray标志持有者中保存的声明重置视图选择/未选定状态。


0
投票

在文件中替换以下代码并尝试

       if(wishlist!=null)
        {
            if(wishlist.equals("1"))   // change is here
            {
                featuredView.img_wishlist.setColorFilter(Color.argb((255,255,0,0));
                featuredView.txt_count.setText("1");
            }
            else (wishlist.equals("0"))   // change is here
            {
                featuredView.img_wishlist.setColorFilter(Color.argb(255,255,111,111));
                featuredView.txt_count.setText("0");
            }
        }
        else
        {
            featuredView.img_wishlist.setColorFilter(Color.argb(255, 211, 211, 211));
            featuredView.txt_count.setText("0");
        }

也是为了这个

    img_wishlist.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                featured_data.get(getAdapterPosition).setWishlist(featured_data.get(getAdapterPosition).getWishlist().equals("0")?"1":"0");
                notifyItemChanged(getAdapterPosition());
                    onclickListener.wishlistOnclick(v,getAdapterPosition());
                }
            });

0
投票
public class FeaturedlistAdapter extends RecyclerView.Adapter<FeaturedlistAdapter.FeaturedView>
{
    private Context context;
    private List<Featured_data> featured_data;

    private final SparseBooleanArray mSparseBooleanArray;


    public FeaturedlistAdapter(Context context, List<Featured_data> featured_data,MyAdapterListener  myAdapterListener) {
        this.context=context;
        this.featured_data=featured_data;
        this.onclickListener=myAdapterListener;
        // init the flag
        mSparseBooleanArray = new SparseBooleanArray();


    }

    @NonNull
    @Override
    public FeaturedView onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(context).inflate(R.layout.list_allbrands, viewGroup, false);
        return new FeaturedView(view);
    }

    @Override
    public void onBindViewHolder(@NonNull FeaturedView featuredView, int i) {

        String price = featured_data.get(i).getProductPrice();
        String name = featured_data.get(i).getProductName();
        String quantity = featured_data.get(i).getProductQty();
        featuredView.getTxt_brandname().setText(featured_data.get(i).getProductName());
        String wishlist=featured_data.get(i).getWishlist();
        Picasso.get().load(HomeConstants.BASE_URL + featured_data.get(i).getProductImage()).placeholder(R.drawable.whitebackground).into(featuredView.img_brand);
        if (price != null && !price.equals("")) {
            String total_price = price + " Rs";
            featuredView.getTxt_brand_price().setText(total_price);
        }
        if (quantity != null && !quantity.equals("")) {
            String total_quantity = quantity + " Items";
            featuredView.getTxt_brand_item().setText(total_quantity);
        }


        if(wishlist!=null)
        {
            if(wishlist.equals("0"))
            {
                featuredView.img_wishlist.setColorFilter(Color.argb(255, 211, 211, 211));
                featuredView.txt_count.setText("0");
            }
            else if(wishlist.equals("1"))
            {
                featuredView.img_wishlist.setColorFilter(Color.argb(255,255,0,0));
                featuredView.txt_count.setText("1");
            }
        }
        int position=featuredView.getAdapterPosition();
        if(mSparseBooleanArray.get(position))
        {
            String value = featuredView.txt_count.getText().toString();
            if (value.equals("0")) {
                featuredView.img_wishlist.setColorFilter(Color.argb(255, 255, 0, 0));

                // save the selected state
            }
            else if (value.equals("1")) {
                featuredView.img_wishlist.setColorFilter(Color.argb(255,211,211,211));
                // save the selected state
            }
        }

    }

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


    @Override
    public long getItemId(int position) {
        return super.getItemId(position);
    }

    @Override
    public int getItemViewType(int position) {
        return super.getItemViewType(position);
    }

    class FeaturedView extends RecyclerView.ViewHolder {
        ImageView img_brand,img_wishlist;
        TextView txt_brandname,txt_brand_price,txt_brand_item,txt_count;

        public ImageView getImg_brand() {
            return img_brand;
        }

        public ImageView getImg_wishlist() {
            return img_wishlist;
        }

        public TextView getTxt_brandname() {
            return txt_brandname;
        }

        public TextView getTxt_brand_price() {
            return txt_brand_price;
        }

        public TextView getTxt_brand_item() {
            return txt_brand_item;
        }

        public TextView getTxt_count() {
            return txt_count;
        }

        FeaturedView(@NonNull View itemView) {
            super(itemView);
            img_brand=itemView.findViewById(R.id.img_brand);
            img_wishlist=itemView.findViewById(R.id.img_wishlist);
            txt_brandname=itemView.findViewById(R.id.txt_brandname);
            txt_brand_price=itemView.findViewById(R.id.txt_brand_price);
            txt_brand_item=itemView.findViewById(R.id.txt_brand_item);
            txt_count=itemView.findViewById(R.id.txt_count);
            img_wishlist.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {

                    String value = txt_count.getText().toString();
                    if (value.equals("0")) {
                        img_wishlist.setColorFilter(Color.argb(255, 255, 0, 0));
                        txt_count.setText("1");

                    } else if (value.equals("1")) {
                        img_wishlist.setColorFilter(Color.argb(255,211,211,211));
                        txt_count.setText("0");


                    }
                    onclickListener.wishlistOnclick(v,getAdapterPosition());
                    mSparseBooleanArray.put(getAdapterPosition(), true);
                    notifyDataSetChanged();

                }
            });
            img_brand.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onclickListener.brandOnClick(v,getAdapterPosition());
                }
            });
        }
    }

    private MyAdapterListener onclickListener;

    public interface MyAdapterListener
    {
        void wishlistOnclick(View view ,int position);
        void brandOnClick(View view,int position);
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.