Data Binding结合RecyclerView如何迁移XML onClick到Kotlin实现onLongClick?
点击绑定逻辑从XML迁移到Kotlin代码的实现
- 第一步:修改item布局XML
删掉根LinearLayout上的android:onClick="@{() -> sumListener.onClick(sum)}"这行绑定表达式,保留ll_item_container的id声明,无需移除标签里的sum、sumListener变量,可兼容现有Data Binding逻辑。 - 第二步:在Adapter层实现事件绑定
RecyclerView的item交互逻辑必须放在Adapter的ViewHolder相关流程中,不要放在Activity/Fragment的全局控件绑定逻辑里。
基础实现可以在onBindViewHolder方法中拿到当前item对应的Sum实体,给LinearLayout设置点击监听器,直接调用原SumListener的回调方法即可,示例代码:override fun onBindViewHolder(holder: SumViewHolder, position: Int) { val currentSum = dataList[position] holder.binding.llItemContainer.setOnClickListener { // 与XML绑定的点击逻辑效果完全等价 sumListener.onClick(currentSum) } } - 性能优化建议
可以把点击事件的设置逻辑挪到ViewHolder的init初始化块中,仅在ViewHolder创建时绑定一次监听器,避免每次item复用时重复设置监听器,回调内通过bindingAdapterPosition获取当前对应的数据即可,写法示例:class SumViewHolder(val binding: ItemSumBinding) : RecyclerView.ViewHolder(binding.root) { init { binding.llItemContainer.setOnClickListener { val realPosition = bindingAdapterPosition if (realPosition == RecyclerView.NO_POSITION) return@setOnClickListener sumListener.onClick(dataList[realPosition]) } } }
长按事件的实现方法
- 统一代码实现方式
和点击事件的逻辑保持一致,在上述设置点击监听器的位置补充长按事件绑定即可,需要注意长按回调要返回true表示消费了该事件,避免长按结束后误触发后续的点击事件,示例代码:binding.llItemContainer.setOnLongClickListener { val realPosition = bindingAdapterPosition if (realPosition == RecyclerView.NO_POSITION) return@setOnLongClickListener val currentSum = dataList[realPosition] // 可在SumListener接口中补充onLongClick方法,实现跨页面的事件回调 sumListener.onLongClick(currentSum) true // 必须返回true表示已消费本次长按事件 }
补充说明:Data Binding本身完全支持onLongClick的直接XML绑定,不存在没有可用绑定属性的问题,只需要在布局中添加对应的表达式
android:onLongClick="@{() -> sumListener.onLongClick(sum)}",同时在SumListener接口中定义对应的长按回调方法即可正常使用。如果需要把所有交互逻辑统一放在Kotlin代码中,按上述代码绑定的方式实现即可。
内容的提问来源于stack exchange,提问作者caibirdcnb
相关产品推荐
相关产品推荐

