Java BindingAdapter未被识别为适用于具有泛型的属性
将Java BindingAdapter未被识别为适用于具有泛型的属性,java,android,mvvm,android-databinding,Java,Android,Mvvm,Android Databinding,将observebleList与@BindingAdapter声明与observebleList匹配的行为非常奇怪 我正在MVVM环境下试用android数据绑定库,偶然发现了一个我不理解的行为,到目前为止还没有找到任何资源 设置: Min SDK: 19 Target SDK: 26 Build Tools Version: 27.0.1 我想使用自定义绑定适配器将android.databinding.observeList绑定到RecyclerView,该适配器获取列表,将其包装到通用
observebleList
与@BindingAdapter
声明与observebleList
匹配的行为非常奇怪
我正在MVVM环境下试用android数据绑定库,偶然发现了一个我不理解的行为,到目前为止还没有找到任何资源 设置:
Min SDK: 19
Target SDK: 26
Build Tools Version: 27.0.1
我想使用自定义绑定适配器将android.databinding.observeList
绑定到RecyclerView
,该适配器获取列表,将其包装到通用RecyclerView.adapter
中,并将其分配给RecyclerView
我的绑定适配器设置如下:
@BindingAdapter({"items"})
public static void bindAdapterWithDefaultBinder(@NonNull RecyclerView recyclerView,
@Nullable ObservableList<Model> items){
... implementation ...
}
@BindingAdapter("items")
public static void bindAdapterWithDefaultBinder(@NonNull RecyclerView recyclerView, @Nullable ObservableList<Model> items) {
... implementation ...
}
编译时,我收到以下错误:
Error:Gradle: Execution failed for task ':app:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:Cannot find the setter for attribute 'app:items' with parameter type android.databinding.ObservableList<_my-package-name_.Repo> on android.support.v7.widget.RecyclerView.
现在,此解决方案使用ObservableList项
适配器声明进行编译,并在运行时正确传播所有更改事件。因此,基本上我将ObservableList
转换为对象
,并将其解释为与适配器定义匹配。什么
请记住,所有这些都发生在编译时,代码生成器知道确切的类型,因此不会发生类型擦除
因此,我的问题顺序如下:
- 为什么第一次实现失败了
- 为什么对
对象进行强制转换可以解决问题
- 既然这看起来像一个丑陋的黑客对我来说-什么是正确的方式来实现这种行为
但请注意作者如何厚颜无耻地将所有模型对象“强制转换”为基类类型,以避免出现这个问题。我认为您应该删除大括号,如下所示:
@BindingAdapter({"items"})
public static void bindAdapterWithDefaultBinder(@NonNull RecyclerView recyclerView,
@Nullable ObservableList<Model> items){
... implementation ...
}
@BindingAdapter("items")
public static void bindAdapterWithDefaultBinder(@NonNull RecyclerView recyclerView, @Nullable ObservableList<Model> items) {
... implementation ...
}
@BindingAdapter(“项”)
公共静态void binderAdapterWithDefaultBinder(@NonNull RecyclerView RecyclerView,@Nullable ObservableList items){
实施
}
谢谢您的建议。本文中的代码是原始代码的简化版本,其中实际注释是@BindingAdapter(value={“items”、“viewProvider”、“itemActionResponder”},requireAll=false)
,因此无法在此处删除大括号。这也不会改变行为,因为实例化注释具有String[]
的值,而使用大括号只是在此处添加单个元素的简写。不,还没有。正如问题中提出的那样,有一个丑陋的解决办法。但我仍然不明白这里发生了什么,为什么。免责声明:我没有用新版本的API测试过这一点。
@BindingAdapter("items")
public static void bindAdapterWithDefaultBinder(@NonNull RecyclerView recyclerView, @Nullable ObservableList<Model> items) {
... implementation ...
}