如何选择recyclerview中列出的所有项目?

时间:2017-08-08 22:13:21

标签: android android-recyclerview

我有recyclerview中的项目列表,它们是多个可选择的。

我希望选择按钮以选择全部,如果选择则取消选择全部。我没有看到任何选项来迭代通过RecyclerView.Adapter来做到这一点。我该如何实现呢?

谢谢。

4 个答案:

答案 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);
        }
    }
}