Kotlin中父类复用Databinding布局时LiveData泛型类型不匹配如何解决?
问题原因
你遇到的编译错误是Kotlin泛型型变规则导致的:泛型在默认情况下是不变的,虽然Child是Parent的子类,但LiveData<List<Child>>并不是LiveData<List<Parent>>的子类型,因此无法直接赋值。
解决方案
方法1:修改布局变量的泛型声明(推荐,适配复用场景)
把布局中data变量的类型加上泛型协变标识out,表示这个变量只作为数据生产者,允许接收Parent及其子类的集合类型,修改后的data标签代码如下:
<data> <variable name="data" type="androidx.lifecycle.LiveData<out java.util.List<out Parent>>" /> </data>
修改后你就可以直接把LiveData<List<Child>>赋值给mBinding.data,同时布局也可以兼容其他继承自Parent的子类集合,满足多Activity复用的需求。
方法2:代码侧强制向上转型
如果不想修改布局,也可以在赋值时做类型转换,不过这种方式存在类型安全隐患,不推荐长期使用:
mBinding.data = viewModel.data as LiveData<List<Parent>>
多Activity复用布局的额外优化建议
- 如果不同Activity需要展示的列表项UI不同,可以给布局新增一个
itemLayoutId或者itemBinder类型的变量,在不同Activity绑定的时候传入对应的项布局/绑定逻辑,不需要修改公共布局本身。 - 公共布局里的通用逻辑(比如列表的分割线、布局管理器默认配置)可以封装成自定义BindingAdapter,所有复用这个布局的场景都可以直接共用逻辑,不需要重复编写代码。
内容的提问来源于stack exchange,提问作者Zappy.Mans
相关产品推荐
相关产品推荐

