我看到一个解决方案,但如果 onBind 多次调用它可能会效率低下 . 将此代码放在一个文件中,以确保共享逻辑不会在其他任何地方公开:
class IncomingFileMVH(itemView: View):
Lib.IncomingTextMVH(itemView) {
override fun onBind(message: ChatMessage) {
super.onBind(message)
bind(message) //Import extension method from Shared
}
}
class OutcomingFileMVH(itemView: View):
Lib.OutComingTextMVH(itemView) {
override fun onBind(message: ChatMessage) {
super.onBind(message)
bind(message)
}
}
private object Shared {
val Lib.BaseMVH.tv: TextView
get() = itemView.findViewById(R.id.text)
fun Lib.BaseMVH.bind(message: ChatMessage) {
tv.text = message.text
}
}
粗略地说这里的问题是我们无法在扩展属性中存储任何值 . 因此,每当调用 onBind 时,它也会调用 itemView.findViewById(R.id.text) .
还有另一种我更喜欢的解决方案 . 为属性创建 Contract 接口,为两个类实现它,并为 onBind() 创建帮助器扩展方法
private interface Base {
val tv: TextView
}
class IncomingFileMVH(itemView: View):
Lib.IncomingTextMVH(itemView), Base {
override val tv: TextView = itemView.findViewById(R.id.text)
override fun onBind(message: ChatMessage) {
super.onBind(message)
bind(message)
}
}
class OutcomingFileMVH(itemView: View):
Lib.OutComingTextMVH(itemView), Base {
override val tv: TextView = itemView.findViewById(R.id.text)
override fun onBind(message: ChatMessage) {
super.onBind(message)
bind(message)
}
}
private fun Base.bind(message: ChatMessage) {
tv.text = message.text
}
是的,您需要使用 View 复制所有属性,但是像以前一样,所有绑定逻辑都放在单个方法和 all properties initialized once 中 .