繁体   English   中英

在 RecyclerView 项目的 onClickListener 中遇到挑战

[英]Having challenge in RecyclerView item's onClickListener

我有一个放置在 RecyclerView 下的项目列表。 在任何项目上,都有一个数量(增加或减少)。 选择添加时,数量应增加一。

在此处输入图片说明

但是当我第一次单击“+”时,数量的值设置为 1,并在重置为 0 后不久,但是当我第二次单击时,该值变为“1”。 同样,当我下次单击该值设置为 2 时,在几分之一秒后它仍然变为 1,我再次单击该值变为 2 时。为什么第一次单击没有被识别? 有人可以在这里帮助我吗?

public class ItemListAdapter  extends RecyclerView.Adapter<ItemListAdapter.ItemViewHolder>{

    private Context mContext;
    private List<Items> itemsList;
    private OnItemListListner onClick;

    public ItemListAdapter(Context mContext,List<Items> itemsList)
    {
        this.mContext=mContext;
        this.itemsList=itemsList;
    }

    @NonNull
    @Override
    public ItemViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        LayoutInflater inflater=LayoutInflater.from(mContext);
        View view=inflater.inflate(R.layout.item_details_layout,null);
        return new ItemListAdapter.ItemViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ItemViewHolder holder, final int position) {
        Items items=itemsList.get(position);
        Log.d("onBindViewHolder",items.getItemName());
        holder.itemNameTV.setText(items.getItemName());
        String strItemPrice=mContext.getResources().getString(R.string.Rs)+" "+String.valueOf(items.getItemPrice());
        holder.itemPriceTV.setText(strItemPrice);
        holder.itemDescTV.setText(items.getItemDescription());

        Glide.with(mContext).load(items.getItemImagePath()).into(holder.imageView);

        holder.itemAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int intCurrentQuantity=Integer.valueOf(holder.itemQuantity.getText().toString());
                intCurrentQuantity+=1;
                Log.d("myQuantity",String.valueOf(intCurrentQuantity));
                holder.itemQuantity.setText(String.valueOf(intCurrentQuantity));
                notifyItemChanged(holder.getAdapterPosition());
            }
        });


        holder.itemNameTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onClick.onItemListClick(position);
            }
        });
        holder.itemPriceTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onClick.onItemListClick(position);
            }
        });
        holder.itemDescTV.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onClick.onItemListClick(position);
            }
        });
        holder.imageView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                onClick.onItemListClick(position);
            }
        });
    }

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

    public void SetOnClick(OnItemListListner onClick)
    {
        this.onClick=onClick;
    }

    class ItemViewHolder extends RecyclerView.ViewHolder {

        ImageView imageView;
        TextView itemNameTV,itemPriceTV,itemDescTV,itemQuantity,itemSubtract,itemAdd;

        public ItemViewHolder(@NonNull View itemView) {
            super(itemView);

            imageView=itemView.findViewById(R.id.itemImageView);
            itemNameTV=itemView.findViewById(R.id.itemNameTextView);
            itemPriceTV=itemView.findViewById(R.id.itemPriceTextView);
            itemDescTV=itemView.findViewById(R.id.itemDescritionTextView);
            itemQuantity=itemView.findViewById(R.id.itemQuantity);
            itemSubtract=itemView.findViewById(R.id.subtractQuantity);
            itemAdd=itemView.findViewById(R.id.addQuantity);
        }
    }

    public interface OnItemListListner{
        void onItemListClick(int position);
    }

}

查看了您的代码,然后在我同意 Harsh 的回答之后,有两种方法可以设置您的适配器。 最常用于存储和检索数据的模型。

您需要创建一个模型类并首先将数据设置到模型中,然后从模型中获取数据并设置到您的适配器中/通知您的适配器。

您需要在模型类中创建一个变量,如下所示:

public class Item {
    String mQty = "";
    public String getmQty() {
        return mQty;
    }

    public void setmQty(String mQty) {
        this.mQty = mQty;
    }
}

有用的答案: 点我

您应该在 Item 模型类中拥有数量属性,并且必须遵循我在下面添加的代码。

holder.itemAdd.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int quantity = item[getAdapterPosition()].quantity;
quantity = quantity +1;
item[getAdapterPosition()].setQuantity(quantity);
notifyItemChanged(getAdapterPosition());
        }
    });

谢谢。我相信这对你有用。

检查更新的代码

 holder.itemAdd.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int intCurrentQuantity=Integer.valueOf(holder.itemQuantity.getText().toString());
                ++intCurrentQuantity; //use this    
                Log.d("myQuantity",String.valueOf(intCurrentQuantity));
                holder.itemQuantity.setText(String.valueOf(intCurrentQuantity));
                notifyItemChanged(holder.getAdapterPosition());
            }
        });

回收器视图回收滚动视图并重置其内容,因此您必须保留数量qty变量。 你可以通过两种方式做到

  1. 将数量存储在您的Items模型中。
  2. 在单独的HashMapitem.getId()数量作为item.getId()作为键和qty作为值。

然后从模型对象或哈希图中获取和设置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM