- 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 == newItemoverride fun areContentsTheSame(oldItem: String,newItem: String) =oldItem == newItem}) {inner class ViewHolder(view: LocationItemBinding) : RecyclerView.ViewHolder(view.root) {private val title = view.companyNameval root = view.rootfun 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 = falselocationId = it.location_id
locationRecyclerview.apply { layoutManager = GridLayoutManager(requireContext(), 1) adapter = locationAdapter } locationAdapter.submitList(data) // 提交数据 locationAdapter.submitList(data){ // 数据填充完成后的回调 参数多选
} ```
