【问题标题】:Pass generic list into <include>将通用列表传递到 <include>
【发布时间】:2016-09-02 13:29:13
【问题描述】:

有两个复杂的布局,一个包含在另一个中。 尝试将一些自定义对象的列表传递到包含的布局中,但构建失败并出现以下错误:

Error:Execution failed for task ':core:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:cannot find type element for List
file:D:\myproject-android\core\src\main\res\layout\view_header.xml
loc:101:27 - 101:42
****\ data binding error ****

view_header.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="vm"
            type="com.catalogz.app.ui.categories.ItemViewModel" />
    </data>
    <FrameLayout>
       <include layout="@layout/include_title_view" bind:items="@{vm.items}/>
    </FrameLayout>
   ...
</layout>

include_title_view.xml:

<layout xmlns:android="http://schemas.android.com/apk/res/android">
    <data>
        <import type="com.catalogz.app.utils.Strings" />
        <import type="com.catalogz.app.app.entities.Item" />
        <import type="java.util.List"/>
        <variable
            name="items"
            type="List&lt;Item&gt;" /> <!-- generic List<Item> -->
    </data>
    <TextView android:text="@{Strings.convert(items)}"/>
</layout>

可以通过删除通用定义 &amp;lt;Item&amp;gt; 将这个问题从 view_header.xml 转移到 include_title_view.xml 但随后它作为方法出现在 Strings.convert(items) 调用中据我了解,需要Item 和布局通过List&lt;Object&gt; 的列表:

Error:Execution failed for task ':core:compileDebugJavaWithJavac'.
> java.lang.RuntimeException: Found data binding errors.
****/ data binding error ****msg:cannot find method convert(java.util.List) in class com.catalogz.app.utils.Strings
file:D:\myproject-android\core\src\main\res\layout\include_title_view.xml
loc:51:32 - 51:61
****\ data binding error ****

【问题讨论】:

  • 你找到答案了吗?我也有同样的情况。为什么会出现这个错误?
  • 它在 IDE 中给我一个错误,在我的情况下无法解析符号 Map&lt;String, Friend&gt;
  • 所以,我决定使用原始类型。它不是那么安全,但至少有效。
  • 关于IDE,它可以假装错误但代码本身是可编译的。以防万一... :)
  • 最后一个,确保你使用转义版本的 >

标签: android android-databinding


【解决方案1】:

我也有同样的问题,但我找到了在包含的布局中设置值的替代方法。我知道这不是一个好习惯,至少它是为包含数据绑定的包含布局设置变量的解决方法。

<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:bind="http://schemas.android.com/apk/res-auto">
    <data>
        <variable
            name="vm"
            type="com.catalogz.app.ui.categories.ItemViewModel" />
    </data>
    <FrameLayout>
       <include 
    android:id="@+id/part1"
    layout="@layout/include_title_view" />
    </FrameLayout>
   ...
</layout>

在活动类中

ActivityMainBinding.part1.setItems(myItems);

希望这会有所帮助。

【讨论】:

  • 这是一个有趣的选项,谢谢。它有点放弃数据绑定本身的优势,但另一方面,它是安全可靠的。我决定有点冒险,只是删除了泛型并将对象转换为所需的类型。
猜你喜欢
  • 2019-01-01
  • 1970-01-01
  • 2013-11-13
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多