我有recyclerview中的项目列表,它们是多个可选择的。
我希望选择按钮以选择全部,如果选择则取消选择全部。我没有看到任何选项来迭代通过RecyclerView.Adapter来做到这一点。我该如何实现呢?
谢谢。
答案 0 :(得分:8)
尝试在Adapter中维护所选项目列表和项目列表
当您选择"全选"按钮,只需添加所选项目列表中的所有项目并调用notifyDataSetChanged
只是一个sudo代码
class adapter {
ArrayList<Item> selected = new ArrayList<Item>();
ArrayList<Item> items = new ArrayList<Item>();
public void selecteAll() {
selected.clear();
selected.addAll(items);
notifyDataSetChanged();
}
public void clearAll() {
selected.clear();
notifyDataSetChanged();
}
public void bindView() {
Item item = items.get(position);
if(selected.contains(item) {
// Do selected action
} else {
// Non selecetd ctions
}
}
}
答案 1 :(得分:1)
就我而言,
步骤-1:-首先在活动类中全局初始化标志
boolean flagSelectAll = false;
步骤-2:-然后在“按钮的点击”中设置以下代码
@OnClick(R.id.btnSelectAll)
public void setBtnSelectAll(View view){
for (int i=0;i<dMyItemLists.size();i++){
if (dMyItemLists.get(i).isSelected()){
flagSelectAll = true;
dMyItemListAdapter.selectAllItem(false);
dMyItemListAdapter.notifyDataSetChanged();
}
else {
dMyItemListAdapter.selectAllItem(true);
dMyItemListAdapter.notifyDataSetChanged();
}
break;
}
}
步骤-3:-然后在recyclerview的adpater类中创建方法selectAllItem,如下所示::
public void selectAllItem(boolean isSelectedAll) {
try {
if (itemList != null) {
for (int index = 0; index < itemList.size(); index++) {
itemList.get(index).setSelected(isSelectedAll);
}
}
notifyDataSetChanged();
} catch (Exception e) {
e.printStackTrace();
}
}
答案 2 :(得分:1)
无需维护带有选定项目的另一个列表。您需要创建一个设置标志的方法,然后在onBindViewHolder方法中检查该标志。像这样:
class MyAdapter(val context: Context): RecyclerView.Adapter<MyAdapter.ViewHolder>() {
val mItems = mutableListOf<ItemObject>()
private var selectAllItems: Boolean = false
fun updateList(list: List<ItemObject>) {
mItems.addAll(list)
notifyDataSetChanged()
}
fun selectAllItems(selectAll: Boolean){
selectAllItems = selectAll
notifyDataSetChanged()
}
override fun onBindViewHolder(viewHolder: ViewHolder, position: Int) {
val pos = viewHolder.adapterPosition
viewHolder.checkbox.isSelected = selectAllItems
}
class ViewHolder(val view: View): RecyclerView.ViewHolder(view) {
val checkbox: Checkbox = view.myCheckBox
}
}
答案 3 :(得分:0)
维护一个单独的列表或标志对我而言不起作用,因为我的回收站视图的内容可以在任何给定时刻更改,而调用notifyDataSetChanged()
对于大型数据集可能会非常昂贵。我想出的解决方案都不使用,而是遍历回收者视图的子级。例如,在响应您的“全选操作”的任何函数中,对子视图进行迭代,如下所示:
RecyclerView rv = ...;
List<View> selection = ...;
...
public void selectAll() {
int count = rv.getChildCount();
for (int i = 0; i < count; i++) {
View view = rv.getChildAt(i);
if (!view.isActivated()) {
view.setActivated(true);
selection.add(view);
}
}
}