【问题标题】:checking a checkbox in recyclerview making other random checkboxes checked too android检查recyclerview中的一个复选框,使其他随机复选框也被选中android
【发布时间】:2020-02-19 20:46:44
【问题描述】:

我有一个带有复选框的 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));
            }                 
        }
    }

【问题讨论】:

  • 发布您的 bindview 持有者

标签: android checkbox android-recyclerview


【解决方案1】:

您不能信任回收站中的视图来保存您的数据状态。

当页面滚动并回收一行时,视图只是用于不同的项目。因此,如果旧项目被选中,现在突然出现新的“随机”项目也被选中。当您向后滚动时,您可能还会看到您之前检查的项目实际上已不再检查。

要解决这个问题,您必须在数据集中保留选中状态,例如在代表一项的 POJO 中。然后,将其绑定到适配器中的视图时,根据该 pojo 状态设置 CheckBox 的选中状态。

【讨论】:

  • 我已经尝试了很多.. 没有什么对我有用.. 请帮助我摆脱这个..
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-13
  • 2018-12-19
  • 2020-10-12
  • 2018-08-05
相关资源
最近更新 更多