gpt4 book ai didi

java - 更改一个项目中的值也会更改另一个项目中的值 - RecyclerView Android

转载 作者:行者123 更新时间:2023-12-01 16:22:11 25 4
gpt4 key购买 nike

问题出在回收器 View 中,如果其中一个项目中的 View 发生更改,则另一个项目中的 View 也会发生更改。它具体在要更改的实际项目位置之后的第 8 个位置发生更改。假设我更改位置 1 中商品的数量或价格,那么位置 1 + 8 = 9 个商品的数量或价格也会更改。我不明白为什么会发生这种情况,因为我只是改变了 View 持有者位置的 View 。如果有人遇到过此类问题或有任何解决方案,那将会有所帮助。谢谢。

RecyclerView布局:

<androidx.recyclerview.widget.RecyclerView
android:id="@+id/product_recyclerview"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/_10sdp"
android:visibility="visible"/>

适配器:

public class ProductAdapter extends RecyclerView.Adapter<ProductAdapter.MyViewHolder> {

private List<ProductItem> productItemList;
private Context context;
private ExpenseActivityContract.Presenter presenter;

public ProductAdapter(Context context, ExpenseActivityContract.Presenter presenter, List<ProductItem> productItemList) {

this.productItemList = productItemList;
this.presenter = presenter;
this.context = context;
}

public class MyViewHolder extends RecyclerView.ViewHolder {

ImageView productImage;
TextView productName, add;
EditText quantity, price;
ImageButton plus, minus;

public MyViewHolder(View v) {

super(v);

productImage = v.findViewById(R.id.product_image);
productName = v.findViewById(R.id.product_name);
add = v.findViewById(R.id.add_product_btn);
quantity = v.findViewById(R.id.quantity_input);
price = v.findViewById(R.id.product_price_input);
plus = v.findViewById(R.id.plus_qnty_btn);
minus = v.findViewById(R.id.minus_qnty_btn);
}
}

@Override
public ProductAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent,
int viewType) {

View v = LayoutInflater.from(parent.getContext())
.inflate(R.layout.product_item_layout, parent, false);

MyViewHolder vh = new MyViewHolder(v);
return vh;
}

@Override
public long getItemId(int position) {

return super.getItemId(position);
}

@Override
public int getItemViewType(int position) {

return super.getItemViewType(position);
}

@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {

holder.productName.setText(productItemList.get(position).getProductName());

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

@Override
public void onClick(View v) {

String input = holder.quantity.getText().toString();

if(TextUtils.isEmpty(input)) {

holder.quantity.setText("1");
}
else {

double qnty = Double.parseDouble(input);
qnty = qnty + 1.00;
holder.quantity.setText(String.valueOf(qnty));
}
}
});

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

@Override
public void onClick(View v) {

String input = holder.quantity.getText().toString();

if(TextUtils.isEmpty(input)) {

holder.quantity.setText("0");
}
else {

double qnty = Double.parseDouble(input);

if(qnty > 1.0) {

qnty = qnty - 1.00;
holder.quantity.setText(String.valueOf(qnty));
}
else if(qnty >= 0.0 && qnty <= 1.0) {

holder.quantity.setText("0");
}
}
}
});
}

@Override
public int getItemCount() {

return productItemList.size();
}
}

最佳答案

这是因为 RecyclerView 的性质。

RecyclerView在绘制新项目时尝试重用(回收)已经绘制的项目(viewHolders)。

由于您从回收的 View 中获取输入,因此它已经有了一个值,并且继续从该值增加/减少。

您需要做的就是在 onBindView 方法中 holder.quantity.setText(some default value); 或将输入存储在模型中。

关于java - 更改一个项目中的值也会更改另一个项目中的值 - RecyclerView Android,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62240651/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com