【问题标题】:Check all the check boxes in recycler view检查recyclerview中的所有复选框
【发布时间】:2018-07-25 09:48:28
【问题描述】:

我有一个回收器视图,它获取一个数组并为它的每个项目创建一个复选框。我希望在回收站视图的顶部有一个复选框,如果它被选中,那么回收站视图的所有复选框也会被选中。我怎样才能做到这一点?

回收站视图适配器:

class RecyclerViewAdapter(val context: Context, val myArray: Array<String>): RecyclerView.Adapter<RecyclerViewAdapter.Holder>(){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val view = LayoutInflater.from(context).inflate(R.layout.recycler_view_pattern,parent,false)
        return Holder(view)
    }

    override fun getItemCount(): Int {
       return myArray.count()
    }

    override fun onBindViewHolder(holder: Holder, position: Int) {
       return holder.bind(myArray[position])
    }

    inner class Holder(itemView: View?): RecyclerView.ViewHolder(itemView){
        val checkBox = itemView?.findViewById<CheckBox>(R.id.checkBox)

        fun bind(str: String){
            checkBox?.text = str

            checkBox?.setOnCheckedChangeListener(object : CompoundButton.OnCheckedChangeListener{
                override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
                    if (checkBox.isChecked){
                       //do something
                    }
                    else{
                        //do something
                    }
                }
            })
        }
    }
}

回收站视图模式:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical"
android:padding="8dp">

<CheckBox
    android:id="@+id/checkBox"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:textColor="#000"
    android:textSize="14sp" />
</LinearLayout>

【问题讨论】:

  • @NileshRathod Dude 我知道如何使用复选框创建回收站视图。我需要一个“检查所有”复选框来检查其他复选框
  • 制作一个包装字符串的模型以及一个布尔值以指示是否选中。使用布尔值来初始化视图绑定中的复选框。选中主复选框后,将所有模型更新为 checked=true 并使用这些新模型更新 RV 适配器
  • @TimCastelijns 谢谢你的回答,但我是初学者,你能写下这个解决方案的代码吗?
  • 我可以,但如果我这样做了,你什么也学不到

标签: android checkbox android-recyclerview kotlin


【解决方案1】:

感谢所有尝试提供帮助的人,我认为唯一的解决方案是制作另一个回收器视图适配器,该适配器创建选中的复选框,并在选中全部选中复选框时将其设置为回收器视图。

MainActivity:

checkAllCheckBox.setOnCheckedChangeListener(object : CompoundButton.OnCheckedChangeListener{
           override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
                if (p1){
                      recyclerView.adapter = RecyclerViewAdapter
                }
                else{
                      recyclerView.adapter = AllCheckedRecyclerViewAdapter
                }
            }
})

AllCheckedRecyclerViewAdapter:

inner class AllCheckedRecyclerViewAdapter(val context: Context, val myArray: Array<String>): RecyclerView.Adapter<AllCheckedRecyclerViewAdapter.Holder>(){
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val view = LayoutInflater.from(context).inflate(R.layout.recycler_view_pattern,parent,false)
        return Holder(view)
    }

    override fun getItemCount(): Int {
        return myArray.count()
    }

    override fun onBindViewHolder(holder: Holder, position: Int) {
        return holder.bindIng(myArray[position])
    }


    inner class Holder(itemView: View?): RecyclerView.ViewHolder(itemView){
        val checkBox = itemView?.findViewById<CheckBox>(R.id.checkBox)

        fun bind(str: String){
            checkBox?.text = str
            checkBox!!.isChecked = true


            ingCheckBox.setOnCheckedChangeListener(object : CompoundButton.OnCheckedChangeListener{
                override fun onCheckedChanged(p0: CompoundButton?, p1: Boolean) {
                    //do sth
                }
            })
        }
    }
}

【讨论】:

  • 再做.adapter的话,RecyclerView列表中的数据会回到初始位置对吧?
【解决方案2】:

在您的适配器中创建一个全局布尔变量

public boolean isAllChecked = false;

然后在你的回收站视图中创建一个公共方法

public void setAllChecked(boolean isAllChecked) {
    this.isAllChecked = isAllChecked;
    notifyDataSetChanged;
}

然后在您的主机活动/片段上,在您的“CHECK ALL CHECKBOX”上设置一个已检查更改的侦听器,并从该方法传递中调用 recyclerViewAdapter.setAllChecked() 方法在 onCheckedChangedMethod 提供的布尔值中。

现在根据 isAllChecked 的条件编辑您的 bind 方法

if(isAllChecked){
   // All Check box is checked 
} else {
   // All checkbox is not checked
}

【讨论】:

  • 感谢您的帮助,解决方案似乎还可以,但它不起作用我认为问题在于回收站视图没有得到更新。整个视图都在一个对话框中。你有什么建议?
  • 在调用 recyclerViewAdapter.setAllChecked() 方法后,您是否尝试从主机调用 'notifyDataSetChanged()' 方法,即从“CheckAll CheckBox”的 checkedChangedListener 内部?
  • 是的,我也这样做了。没有变化
  • 我尝试了其他方法,它显然可以正常工作。这可能看起来很傻,但我创建了另一个回收器视图适配器,就像以前的一样,但有所不同。它会检查它制作的每个复选框!然后我将该适配器设置为查找检查所有复选框时的回收器视图。 span>
  • 太棒了..编程中的变通方法有很多可能性..:D
猜你喜欢
  • 1970-01-01
  • 2020-03-29
  • 2012-04-10
  • 1970-01-01
  • 2013-02-02
  • 2016-02-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多