Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java BindingAdapter未被识别为适用于具有泛型的属性_Java_Android_Mvvm_Android Databinding - Fatal编程技术网

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 ...
}