我目前正在开发一个电子商务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();
}
}
});
}
答案 0 :(得分:1)
将ViewHolder与RecyclerView一起使用
https://www.androidhive.info/2016/01/android-working-with-recycler-view/
答案 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中获得位置时,请尝试将其删除并使用默认位置。