美文网首页
Android 基于 BaseQuickAdapter 的列表全

Android 基于 BaseQuickAdapter 的列表全

作者: 雁过留声_泪落无痕 | 来源:发表于2022-04-07 16:47 被阅读0次

    预期

    列表的全部选中和额外的全选按钮进行联动。

    效果

    emulator.gif

    实现

    class TestAllSelectActivity : AppCompatActivity() {
    
        private lateinit var recyclerView: RecyclerView
        private lateinit var adapter: MyAdapter
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_all_select)
    
            initView()
            initData()
        }
    
        private fun initView() {
            val selectAllCheckBox = findViewById<CheckBox>(R.id.check)
            val selectAllTextView = findViewById<TextView>(R.id.select_all)
            selectAllCheckBox.setOnClickListener {
                selectAllTextView.performClick()
            }
            selectAllTextView.setOnClickListener {
                if (adapter.allSelected) {
                    adapter.unSelectAll()
                } else {
                    adapter.selectAll()
                }
            }
    
            recyclerView = findViewById(R.id.recycler_view)
            recyclerView.layoutManager = GridLayoutManager(this, 2)
            adapter = MyAdapter(R.layout.item_activity_all_select, object : SelectChangeListener {
                override fun onSelectChange(position: Int, selectedCount: Int, allSelected: Boolean) {
                    selectAllCheckBox.isChecked = allSelected
                }
            })
            recyclerView.adapter = adapter
        }
    
        private fun initData() {
            val list = mutableListOf<MyItem>()
            repeat(40) {
                list.add(MyItem("this is $it."))
            }
            adapter.setList(list)
        }
    
        data class MyItem(val name: String, override var selected: Boolean = false) : SelectableItem
    
        class MyAdapter constructor(
            layoutResId: Int,
            selectChangeListener: SelectChangeListener? = null
        ) : SelectableBaseQuickAdapter<MyItem, BaseViewHolder>(layoutResId, selectChangeListener) {
            override fun convert(holder: BaseViewHolder, item: MyItem) {
                holder.setText(R.id.name, item.name)
    
                val checkBox = holder.getView<CheckBox>(R.id.check)
                checkBox.isChecked = item.selected
                holder.itemView.setOnClickListener {
                    val position = holder.adapterPosition
                    if (item.selected) {
                        unSelect(position)
                    } else {
                        select(position)
                    }
                }
                checkBox.setOnClickListener {
                    holder.itemView.performClick()
                }
            }
        }
    
        abstract class SelectableBaseQuickAdapter<T : SelectableItem, VH : BaseViewHolder>(
            layoutResId: Int,
            private val selectChangeListener: SelectChangeListener? = null
        ) : BaseQuickAdapter<T, VH>(layoutResId), SelectableAdapter {
            override var allSelected: Boolean = false
                get() {
                    val count = getSelectedCount()
                    return count > 0 && count == data.size
                }
    
            override fun getSelectedCount(): Int {
                return data.count {
                    it.selected
                }
            }
    
            override fun select(position: Int) {
                if (data[position].selected) {
                    return
                }
    
                data[position].select()
                val count = getSelectedCount()
                selectChangeListener?.onSelectChange(
                    position,
                    count,
                    count == data.size
                )
                notifyItemChanged(position)
            }
    
            override fun unSelect(position: Int) {
                if (!data[position].selected) {
                    return
                }
    
                data[position].unSelect()
                val count = getSelectedCount()
                selectChangeListener?.onSelectChange(
                    position,
                    count,
                    count == data.size
                )
                notifyItemChanged(position)
            }
    
            override fun selectAll() {
                for (position in 0 until data.size) {
                    select(position)
                }
            }
    
            override fun unSelectAll() {
                for (position in 0 until data.size) {
                    unSelect(position)
                }
            }
        }
    
        interface SelectChangeListener {
            fun onSelectChange(position: Int, selectedCount: Int, allSelected: Boolean)
        }
    
        interface SelectableItem {
            var selected: Boolean
            fun select() {
                selected = true
            }
    
            fun unSelect() {
                selected = false
            }
        }
    
        interface SelectableAdapter {
            var allSelected: Boolean
            fun getSelectedCount(): Int
            fun select(position: Int)
            fun unSelect(position: Int)
            fun selectAll()
            fun unSelectAll()
        }
    
    }
    

    相关文章

      网友评论

          本文标题:Android 基于 BaseQuickAdapter 的列表全

          本文链接:https://www.haomeiwen.com/subject/izkssrtx.html