- ListAdapter不需要得到size。因为传入多少数据,它的size默认就是多大。一共需要传入三个类型,一个数据类型,一个ViewHolder,最后一个就是构造函数中的Diffutil,用来局部更新RecyclerView,不需要考虑乱序等问题,也不需要notifichanged,不会影像RecyclerView的性能
// 写一个构造用来给item设置点击事件回调
class LocationAdapter(private val itemClick: (String) -> Unit) :
ListAdapter<String, LocationAdapter.ViewHolder>(
object : DiffUtil.ItemCallback<String>() {
override fun areItemsTheSame(
oldItem: String,
newItem: String
) =
oldItem == newItem
override fun areContentsTheSame(
oldItem: String,
newItem: String
) =
oldItem == newItem
}
) {
inner class ViewHolder(view: LocationItemBinding) : RecyclerView.ViewHolder(view.root) {
private val title = view.companyName
val root = view.root
fun bind(string: String) {
title.text = string.name_en
}
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int) = ViewHolder(
LocationItemBinding.inflate(
LayoutInflater.from(parent.context),
parent,
false
)
).apply {
root.setOnClickListener {
itemClick(getItem(absoluteAdapterPosition)) // getItem(index)函数可以拿到Rv中的某一项
}
}
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.bind(getItem(position))
}
}
- 在View中使用
```kotlin
// 大括号为item点击事件
private val locationAdapter = LocationAdapter {
}binding.loginBox.spinner.setText(it.name_en)
binding.loginBox.locationRecyclerview.isVisible = false
locationId = it.location_id
locationRecyclerview.apply { layoutManager = GridLayoutManager(requireContext(), 1) adapter = locationAdapter } locationAdapter.submitList(data) // 提交数据 locationAdapter.submitList(data){ // 数据填充完成后的回调 参数多选
} ```