Android 基于 BaseQuickAdapter 的列表全

2022-04-07  本文已影响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()
    }

}
上一篇下一篇

猜你喜欢

热点阅读