如何使用Kotlin与Data Binding处理RecyclerView列表项内部视图点击事件
实现RecyclerView列表项内部视图点击的两种方案
方案1:通过DataBinding在XML绑定(推荐,代码侵入性低)
不需要修改现有ViewHolder逻辑,仅需调整监听器和布局配置即可:
1. 扩展点击监听器,区分不同点击事件
修改ItemListListener,新增内部按钮点击的回调方法:
class ItemListListener( // 列表项整体点击回调 val onItemClick: (singleItem: Item) -> Unit, // 列表项内部添加按钮点击回调 val onAddOneButtonClick: (singleItem: Item) -> Unit ) { fun onItemClick(item: Item) = onItemClick(item) fun onAddOneButtonClick(item: Item) = onAddOneButtonClick(item) }
2. 布局XML绑定点击事件
在ItemListItemBinding对应的布局文件中,给对应控件添加点击绑定:
- 列表项根布局如果需要整体点击,添加属性:
android:onClick="@{() -> clickListener.onItemClick(item)}" - 内部
addOneButton添加属性:android:onClick="@{() -> clickListener.onAddOneButtonClick(item)}"
配置完成后无需修改ViewHolder的bind方法,现有绑定逻辑已经可以生效。
方案2:在ViewHolder中直接代码设置点击事件
如果不想修改XML,可以直接在bind方法中给内部按钮设置点击监听:
fun bind(item : Item, clickListener : ItemListListener) { binding.item = item binding.clickListener = clickListener // 给内部按钮设置点击事件 binding.addOneButton.setOnClickListener { // 触发回调,将当前item传递到外部 clickListener.onAddOneButtonClick(item) } binding.executePendingBindings() }
调用示例
在Activity/Fragment中初始化Adapter时,传入对应回调处理逻辑即可:
val adapter = ItemListAdapter( ItemListListener( onItemClick = { item -> // 处理列表项整体点击逻辑 Toast.makeText(this, "点击了条目:${item.itemName}", Toast.LENGTH_SHORT).show() }, onAddOneButtonClick = { item -> // 处理内部添加按钮点击逻辑 viewModel.addItemCount(item) } ) ) recyclerView.adapter = adapter
注意事项
现有DiffCallback的两个判断逻辑写反了,会导致列表刷新异常,修正后代码如下:
companion object DiffCallback : DiffUtil.ItemCallback<Item>() { override fun areItemsTheSame(oldItem : Item , newItem : Item) : Boolean { // 仅判断id,确认是否为同一个条目 return oldItem.itemId == newItem.itemId } override fun areContentsTheSame(oldItem : Item , newItem : Item) : Boolean { // 判断全部内容,确认是否需要刷新条目 return oldItem == newItem } }
内容的提问来源于stack exchange,提问作者brandNoob
相关产品推荐
相关产品推荐

