【问题标题】:Having challenge in RecyclerView item's onClickListener在 RecyclerView 项目的 onClickListener 中遇到挑战
【发布时间】:2020-02-21 10:27:18
【问题描述】:

我有一个放置在 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);
    }

}

【问题讨论】:

标签: android android-recyclerview


【解决方案1】:

您应该在 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());
        }
    });

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

【讨论】:

  • 感谢您的回复。是的,此时,我不打算在项目模型中保存数量,因为任何点用户都将显示为 0 数量和所有项目的 + 和 - 符号。单击这些符号时,我们需要更新数量。所以正如上面Harsh所说,我按照HashMap来存储位置和当前数量。当用户添加或减去时,数量会从 HashMap 更新。
  • 好的,这不是你逻辑的问题,亲爱的你也可以过滤显示或不显示数量,但这取决于你的逻辑。
【解决方案2】:

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

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

您需要在模型类中创建一个变量,如下面的 sn-p:

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

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

有用的答案:Click Me

【讨论】:

  • 这个答案也会有所帮助,但这也可以用 HashMap 来完成,而不是根据我目前的需要创建一个单独的类。
【解决方案3】:

Recycler 视图在滚动时回收视图并重置其内容,因此您必须保持数量 qty 变量。你可以通过两种方式做到这一点

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

然后从模型对象或 hashmap 中获取和设置。

【讨论】:

  • 第二种方法帮助了我。感谢您的见解。
  • 基本上,更糟糕的一个:D
【解决方案4】:

检查更新的代码

 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());
            }
        });

【讨论】:

  • 值未更新。从逻辑上讲,上述方法也可能行不通。你能解释一下如果前缀的增量比我使用的多吗?
猜你喜欢
  • 1970-01-01
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多