我有一个具有复选框的recyclerview适配器..当我尝试检查一个盒子时,recyclerview也会检查随机复选框。实际上我发现了错误,因为所有复选框都有一个状态并重新使用视图..而且我也是尝试过stackoverflow中发布的很多选项,但没有任何对我有用..
如果有任何项目,则在下面检查表格,然后检查该特定项目复选框。
if(Objects.equals(orderTable.getItemCode(), items.getItemCode()) && Objects.equals(orderTable.getStoreId(), storesPojos.getId()))
{
/* Log.e(TAG+" Order Table Code", String.valueOf(orderTable.getItemCode()));
Log.e(TAG+" ItemsPojo Code", String.valueOf(items.getItemCode()));
Log.e(TAG +" Order Table ID",orderTable.getStoreId());
Log.e(TAG+" store ID",orderTable.getStoreId());*/
Log.e("Position of Adapter///", String.valueOf(position));
Log.e("SelectedPosition of Adapter///", String.valueOf(selectedPosition));
if(selectedPosition == position){
holder.checkBox.setChecked(true);
}
else{
holder.checkBox.setChecked(false);
}
checked++;
noOfItems.setText(String.valueOf(checked));
}
以下代码是我的checkbox.setOnCheckedChangeListener()
holder.checkBox.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
ItemsPojo itemsPojo = itemList.get(position);
if(selectedPosition == position)
{
checked++;
noOfItems.setText(String.valueOf(checked));
dbHelper.insertItemFromOrderTable(itemsPojo.getItemCode());
}
else
{
checked--;
noOfItems.setText(String.valueOf(checked));
dbHelper.deleteItemFromOrderTable(itemsPojo.getItemCode());
}
这是我的onBindViewHolder():
@Override
public void onBindViewHolder(final ItemsAdapter.MyViewHolder holder, final int position) {
Log.i("Position of Adapter///", String.valueOf(position));
items = itemsPojos.get(position);
selectedPosition = position;
holder.product.setText(items.getProduct());
holder.desc.setText(items.getSubCategory());
if(orderTables.size()!=0) {
Log.e("Order Table Size ", String.valueOf(orderTables.size()));
for (OrderTable orderTable : orderTables) {
if(Objects.equals(orderTable.getItemCode(), items.getItemCode()) && Objects.equals(orderTable.getStoreId(), storesPojos.getId()))
{
/* Log.e(TAG+" Order Table Code", String.valueOf(orderTable.getItemCode()));
Log.e(TAG+" ItemsPojo Code", String.valueOf(items.getItemCode()));
Log.e(TAG +" Order Table ID",orderTable.getStoreId());
Log.e(TAG+" store ID",orderTable.getStoreId());*/
Log.e("Position of Adapter///", String.valueOf(position));
Log.e("SelectedPosition of Adapter///", String.valueOf(selectedPosition));
if(selectedPosition == position){
holder.checkBox.setChecked(true);
}
else{
holder.checkBox.setChecked(false);
}
checked++;
noOfItems.setText(String.valueOf(checked));
}
}
}
答案 0 :(得分:0)
您无法信任回收站中的视图来保存数据的状态。
滚动页面并回收行时,视图仅用于其他项目。因此,如果检查旧项目,现在突然显示新的“随机”项目也会被检查。您可能还会看到当您向后滚动时,您之前检查过的项目实际上已不再被选中。
要解决此问题,您必须将检查状态保留在数据集中,例如在代表一个项目的POJO中。然后,当它绑定到适配器中的视图时,您可以根据该pojo状态设置CheckBox的已检查状态。