一个按钮单击将触发Andoid RecyclerView中的另一个按钮

时间:2018-06-26 05:51:53

标签: android listview android-recyclerview buttonclick

我目前正在开发一个电子商务Android应用程序。在我的recyclerview中,从数据库动态填充了13种产品。当我单击列表中的第一个按钮时,它还会更改列表中第11个按钮的按钮文本(我编码为在单击按钮时将按钮文本从“添加”更改为“删除”)。就像明智选择第二个按钮一样,单击可更​​改第十二个视图按钮的文本。 在日志中,我注意到两个按钮具有相同的内存值。 我在做错什么吗?

以下是在3次不同的按钮单击(第一个,第11个和第2个按钮)上生成的日志:

android.support.v7.widget.AppCompatButton{9b877fd VFED..C.. ...P.... 740,120-1010,240 #7f090024 app:id/button}
android.support.v7.widget.AppCompatButton{9b877fd VFED..C.. ...P.... 740,120-1010,240 #7f090024 app:id/button}
android.support.v7.widget.AppCompatButton{b7dcb1b VFED..C.. ...P.... 740,120-1010,240 #7f090024 app:id/button}

@Override
public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
    Glide.with(mContext)
            .asBitmap()
            .load(productsList.get(position).getImage())
            .into(holder.imageView);

    holder.itemname.setText(productsList.get(position).getName());
    holder.itemprice.setText(productsList.get(position).getPrice());
    holder.itemprice_g.setText(productsList.get(position).getPrice_g());

    holder.button.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            int position1 = holder.getAdapterPosition();
            if(!productsList.get(position1).isAddedTocart())
            {
                productsList.get(position1).setAddedTocart(true);
                String x = productsList.get(position1).getName().toString();
                Log.i("log",""+holder.button);
                holder.button.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
                holder.button.setPadding(0,0,0,0);
                holder.button.setText("Remove");

                ((AddorRemoveCallbacks)mContext).onAddProduct();

            }
            else
            {
                productsList.get(position1).setAddedTocart(false);
                holder.button.setText("Add");
                holder.button.setPadding(12,0,0,0);
                holder.button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_shopping_cart_black_24dp, 0, 0, 0);
                ((AddorRemoveCallbacks)mContext).onRemoveProduct();
            }
        }
    });
}

4 个答案:

答案 0 :(得分:1)

答案 1 :(得分:1)

onBindViewHolder中,应首先在holder.button之前初始化setOnClickListener的状态,例如:

...
holder.itemname.setText(productsList.get(position).getName());
holder.itemprice.setText(productsList.get(position).getPrice());
holder.itemprice_g.setText(productsList.get(position).getPrice_g());

if (productsList.get(position1).isAddedTocart()) {
    holder.button.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
    holder.button.setPadding(0,0,0,0);
    holder.button.setText("Remove");
} else {
    holder.button.setText("Add");
    holder.button.setPadding(12,0,0,0);
    holder.button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_shopping_cart_black_24dp, 0, 0, 0);
}

holder.button.setOnClickListener(new View.OnClickListener() {
...

答案 2 :(得分:0)

尝试一下,首先在适配器持有人类中初始化一个变量。 例如,您的型号类别产品;我认为,ProductList产品;然后尝试在onBindViewHolder中进行以下更改。

     @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
holder.product = productList.get(position);
        Glide.with(mContext)
                .asBitmap()
                .load(holder.product.getImage())
                .into(holder.imageView);

        holder.itemname.setText(holder.product.getName());
        holder.itemprice.setText(holder.product.getPrice());
        holder.itemprice_g.setText(holder.product.getPrice_g());

        holder.button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(!holder.product.isAddedTocart())
                {
                    holder.product.setAddedTocart(true);
                    String x = holder.product.getName().toString();
                    Log.i("log",""+holder.button);
                    holder.button.setCompoundDrawablesWithIntrinsicBounds(0, 0, 0, 0);
                    holder.button.setPadding(0,0,0,0);
                    holder.button.setText("Remove");

                    ((AddorRemoveCallbacks)mContext).onAddProduct();

                }
                else
                {
                    holder.product.setAddedTocart(false);
                    holder.button.setText("Add");
                    holder.button.setPadding(12,0,0,0);
                    holder.button.setCompoundDrawablesWithIntrinsicBounds(R.drawable.ic_shopping_cart_black_24dp, 0, 0, 0);
                    ((AddorRemoveCallbacks)mContext).onRemoveProduct();
                }
            }
        });
    }

答案 3 :(得分:0)

为什么要使用“ int position1 = holder.getAdapterPosition();” 当您已经在bindholder中获得位置时,请尝试将其删除并使用默认位置。