请问下BindingViewHolder文件中的ListAdapter是怎么用的?
kystudio opened this issue · 2 comments
kystudio commented
如题
DylanCaiCoding commented
没想到有人注意到这个,奖励你一朵小红花。
在 MainActivity 有使用的示例。
private val adapter = ListAdapter<Foo, ItemFooBinding>(DiffCallback()) {
binding.tvFoo.text = it.value
}
class DiffCallback : DiffUtil.ItemCallback<Foo>() {
override fun areItemsTheSame(oldItem: Foo, newItem: Foo) = oldItem.value == newItem.value
override fun areContentsTheSame(oldItem: Foo, newItem: Foo) = oldItem.value == newItem.value
}
这里的 ListAdapter 不是 ListView 的适配器,是官方用 RecyclerView.Adapter 结合 DiffUtil 封装的适配器,构造函数需要传个 DiffUtil.ItemCallback 的参数,有兴趣自己去了解一下,挺好用的。
我之前想尝试不写适配器类,直接把适配器对象定义出来,所以就对 ListAdapter 封装了上面的用法。用起来挺简洁的,但是会让 Activity 的可读性差一点,而且这样写的适配器不能复用,感觉还是另写一个适配器类更好。不过封装的代码也就 10 行,所以暂时保留着想再多尝试一下。
目前并不是很推荐这样用,也没有写到 Wiki 文档里,后续可能会把这部分代码去掉。
kystudio commented
val foo5Adapter = ListAdapter(diffCallback, ItemFooBinding::inflate) { item ->
binding.tvName.text = item.name
onItemClick {
Toast.makeText(
requireContext(),
"foo5Adapter 点击了${item.name}, position: $it",
Toast.LENGTH_SHORT
)
.show()
}
}
foo5Adapter.submitList(data)
我之前已经这么写了,后来忘了写过。。。