2016-11-07 62 views
1

选择在我的OnBindViewHolder我已经添加以下代码:并非所有项目都recyclerview机器人

if(checkAllItems) { 
     viewHolder.checked_for_deletion.setChecked(true); 
    } else { 
     viewHolder.checked_for_deletion.setChecked(false); 
    } 

的问题是,OnBindViewHolder只要求可见项+缓存的项目是默认值为2。我需要选择不可见的项目。我四处寻找解决方案,但找不到任何工作。

+2

那么显然你应该将它存储在模型类中,而不是查看... – Selvin

+0

是否要删除回收站视图中的所有项目?如果是的话,为什么不只是清除你的列表,而是在onBindViewHolder中做。如果你只是想显示勾号的项目,那么你当前的代码没有问题 –

+0

我认为我已经完全错误了,我确实将它存储在数据模型类中,但只根据它们是否在视图中进行检查。我应该做的是循环通过数据模型,并在那里检查它们并检查onbindview是否被检查。 – Emsal

回答

3

绑定ViewHolder时无法检查所有项目。

这是因为一次只能创建一定数量的ViewHolder(以填充您的RecyclerView)。然后这些ViewHolders在它们通过RecyclerView的界限时被“回收”。它们被重用于未来的内容行。

你需要做的是在你的数据模型中保存CheckBox的状态。然后,检查是否需要每次调用onBindViewHolder时检查CheckBox

+0

我知道这一点,我确实将它存储在数据模型中。所以你说的是,如果点击一个检查所有项目的按钮。我应该通过数据模型循环并将它们设置为检查并在onbindviewholder中检查它们是否被选中,然后相应地设置它们。 – Emsal

+0

准确地说。如果您设置了单击必须设置所有项目的按钮,那么您应该将所有这些项目设置为在数据源中进行检查。当您再次获取该信息时,只需检查该值是否应该检查CheckBox。 – Knossos

0

这是我根据上面的答案所做的,出于某种原因,我必须根据视图更改模型。这不起作用的原因很明显,因为并非所有项目都显示在视图中。我通过模型师迭代并在那里检查。

  checkbox_selectAllListener = new CompoundButton.OnCheckedChangeListener() { 
      @Override 
      public void onCheckedChanged(CompoundButton compoundButton, boolean isChecked) { 
       int c = 0; 
       if(isChecked) { 

        for (TaskModel iterable_element : mDataset) { 
         iterable_element.setCheckedForDeletion(true); 
         Log.e("Setting checked ", ""+ c); 
         c++; 
        } 
       } else { 
        for (TaskModel iterable_element : mDataset) { 
         iterable_element.setCheckedForDeletion(false); 
        } 

        Log.e("Setting unchecked ", ""+ c); 
        c++; 
       } 


       notifyDataSetChanged(); 
      } 
     }; 
+0

根据您的数据源,如果您使用Sqlite,则可能会更简单地在第二个调用中执行所有更新。现在,你会在你的数据库上做一个相当昂贵的调用。如果你做'Model.setAllChecked(true);'你可能会有更好的体验。例如,“UPDATE table SET checked = true”。 – Knossos

+0

我使用SharedPreferences存储数据,发送到适配器的数据是SharedPreferences中项目的过滤列表。 – Emsal

+0

啊,那么你真的无法帮到它。好。 – Knossos

相关问题