事出
今天同事写了一个对RecyclerView的item的勾选功能,给我看了下有点卡,来问我怎么处理好。虽然以前的项目有写过,但是没仔细总结,忘了。所以就想总结一遍,顺便写了个工具类。
效果图
工具类关键点
1.定义一个 selectList 列表储存选中的元素 2.notifySelectView(),设置点击事件,点击item,selectList中包含选中的item信息就移除,不包含就添加item信息,然后刷新选中的位置 3.刷新位置会触发 cover() 执行 changeViewState(),根据 selectList 的内容更新选中或不选中的 View 的状态
工具类代码
import android.view.View
/**
* @author Tom.wu
* @Description:
* @Package: com.wjm.util
* @data 2022/1/21 15:42
*/
class MultipleAdapterHelper<T>(val adapter: IAdapterHelper<T>) {
val selectList = arrayListOf<T>()
inline fun changeViewState(item:T, doContains:()->Unit, doRemoved:()->Unit){
if (selectList.contains(item)) {
doContains()
} else {
doRemoved()
}
}
inline fun notifySelectView(view:View, item:T, position: Int, crossinline notify:()->Unit){
view.setOnClickListener {
if (selectList.contains(item)) {
selectList.remove(item)
} else {
selectList.add(item)
}
notify()
adapter.notifyAdapter(position)
}
}
inline fun notifySelectView(view:View, item:T,crossinline notify:()->Unit){
view.setOnClickListener {
if (selectList.contains(item)) {
selectList.remove(item)
} else {
selectList.add(item)
}
notify()
val position = adapter.getSrcList().indexOf(item)
adapter.notifyAdapter(position)
}
}
fun addDefaultSelectData(list: MutableList<T>){
selectList.addAll(list)
}
fun selectAll(){
val srcList = adapter.getSrcList()
selectList.removeAll(srcList.toSet())
selectList.addAll(srcList)
adapter.notifyAdapter()
}
fun removeSelectAll(){
selectList.clear()
adapter.notifyAdapter()
}
fun contrarySelectAll() {
val srcList = adapter.getSrcList()
val newList = arrayListOf<T>()
newList.addAll(selectList)
selectList.clear()
selectList.addAll(srcList)
selectList.removeAll(newList.toSet())
adapter.notifyAdapter()
}
interface IAdapterHelper<T> {
/**
* 添加默认选中数据
* @param list MutableList<T>
*/
fun addDefaultSrcList(list:MutableList<T>)
/**
* 获取recycleView数据源
* @return List<T>
*/
fun getSrcList(): List<T>
/**
* 刷新recycleView
*/
fun notifyAdapter()
/**
* 部分刷新recycleView
* @param position Int
*/
fun notifyAdapter(position: Int)
/**
* 已经选择的元素列表
* @return List<T>
*/
fun getSelectList(): List<T>
/**
* 全选
*/
fun selectAll()
/**
* 取消全选
*/
fun removeSelectAll()
/**
* 反选
*/
fun contrarySelectAll()
}
}
adapter使用代码
这里的adapter使用了第三方封装的RecyclerView框架,工具类也适用通常的写法
import com.chad.library.adapter.base.BaseQuickAdapter
import com.chad.library.adapter.base.viewholder.BaseViewHolder
import com.wjm.myapplication.R
import com.wjm.util.MultipleAdapterHelper
import kotlinx.android.synthetic.main.rv_select_item.view.*
class TestAdapter : BaseQuickAdapter<Int, BaseViewHolder>(R.layout.rv_select_item),MultipleAdapterHelper.IAdapterHelper<Int>{
private val multipleAdapterHelper by lazy {
MultipleAdapterHelper(this)
}
override fun convert(holder: BaseViewHolder, item: Int) {
holder.itemView.apply {
imageCover.setImageResource(item)
multipleAdapterHelper.changeViewState(item, doContains = {
selectImage.setImageResource(R.mipmap.ic_checked)
}, doRemoved = {
selectImage.setImageResource(R.mipmap.ic_uncheck)
})
multipleAdapterHelper.notifySelectView(selectImage, item, holder.adapterPosition) {}
}
}
override fun getSelectList(): List<Int> = multipleAdapterHelper.selectList
override fun selectAll() {
multipleAdapterHelper.selectAll()
}
override fun removeSelectAll() {
multipleAdapterHelper.removeSelectAll()
}
override fun contrarySelectAll() {
multipleAdapterHelper.contrarySelectAll()
}
override fun getSrcList(): List<Int> = data
override fun notifyAdapter() {
notifyDataSetChanged()
}
override fun notifyAdapter(position: Int) {
notifyItemChanged(position)
}
override fun addDefaultSrcList(list: MutableList<Int>) {
multipleAdapterHelper.addDefaultSelectData(list)
}
}
Activity使用代码
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.util.Log
import androidx.recyclerview.widget.LinearLayoutManager
import com.wjm.myapplication.R
import kotlinx.android.synthetic.main.activity_select_image.*
class TestActivity : AppCompatActivity() {
private val TAG = this.javaClass.simpleName
private val selectAdapter by lazy {
TestAdapter()
}
private val list = arrayListOf<Int>(
R.mipmap.bg1,
R.mipmap.bg2,
R.mipmap.bg3,
R.mipmap.bg4,
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_select_image)
for (i in 1 .. 8){
val id = resources.getIdentifier("a$i", "drawable", packageName)
list.add(id)
}
container.layoutManager = LinearLayoutManager(this)
container.adapter = selectAdapter
selectAdapter.setList(list)
outPath.setOnClickListener {
selectAdapter.getSelectList().forEach {
Log.d(TAG, "onCreate: ------------------$it")
}
}
selectAll.setOnClickListener {
selectAdapter.selectAll()
}
removeAll.setOnClickListener {
selectAdapter.removeSelectAll()
}
contraryAll.setOnClickListener {
selectAdapter.contrarySelectAll()
}
delete.setOnClickListener {
val data = selectAdapter.data
data.removeAll(selectAdapter.getSelectList())
selectAdapter.notifyDataSetChanged()
}
}
}