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()
}
}