检查recyclerview中的复选框,使其他随机复选框也被检查了android

时间:2017-10-27 12:17:41

标签: android checkbox android-recyclerview

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

1 个答案:

答案 0 :(得分:0)

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

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

要解决此问题,您必须将检查状态保留在数据集中,例如在代表一个项目的POJO中。然后,当它绑定到适配器中的视图时,您可以根据该pojo状态设置CheckBox的已检查状态。