如何使用数据绑定在XML中表示对象数组?

时间:2017-10-23 16:18:13

标签: android-databinding

使用数据绑定,我正在尝试将位于Tile[] tiles的成员变量Model model连接到我的XML文件中的TextView。但是,我收到以下gradle错误:

Error:(106, 33) Identifiers must have user defined types from the XML file. tiles is missing it

这是我的XML的一部分:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android">

    <data>

        <variable
            name="(Tile[]) tiles"
            type="com.myapp.Model" />
    </data>

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

            <TextView
                android:id="@+id/tv0"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:text='@{tiles[0].getValue == 0 ? "" : tiles[0].getValue}'
                android:textSize='@{tiles[0].getValue &lt; 100 ? "48sp" : tiles[0].getValue &lt; 1000 ? "36sp" : "24sp"}'/>

            <TextView
                android:id="@+id/tv1"
                android:layout_width="100dp"
                android:layout_height="100dp"
                android:text='@{tiles[1].getValue == 0 ? "" : tiles[1].getValue}'
                android:textSize='@{tiles[1].getValue &lt; 100 ? "48sp" : tiles[1].getValue &lt; 1000 ? "36sp" : "24sp"}'/>

        ...

    </RelativeLayout>
</layout>

这是Model课程的一部分:

class Model {
    private Tile[] tiles = new Tile[16];

    Model(Tile[] tiles) {
        setTiles(tiles);
    }

    Tile[] getTiles(){ return tiles;}

    void setTiles(Tile[] tiles) { System.arraycopy(tiles, 0, this.tiles, 0, tiles.length); }

    int getValue(int index) { return tiles[index].getValue(); }

    void setValue(int index, int value) { tiles[index].setValue(value); }

    int getId(int index) { return tiles[index].getId(); }

    void setId(int index, int id) { tiles[index].setId(id);}
}

这是Tile班级的一部分:

class Tile {
    private int value;
    private int id;

    Tile(int id, int value) {
        this.id = id;
        this.value = value;
    }

    int getValue() {
        return value;
    }

    void setValue(int value) {
        this.value = value;
    }

    int getId() {
        return id;
    }

    void setId(int id) {
        this.id = id;
    }
}

最有可能的是,这一行错误:type="com.myapp.Model",因为我的tiles变量的类型不是Model,但编译器/ gradle不允许我放com.myapp.Tile也不com.myapp.Tile[] 1}}也不com.myapp.Model.Tile[]。如何正确声明我的Tile[]变量?

1 个答案:

答案 0 :(得分:3)

在xml中尝试使用它:

<variable
    name="tiles"
    type="com.<your package>.Tile[]"/> //it might show you an error in xml but you can ignore it.

并从activity / fragment / viewmodel

设置其值
binding.setTiles(<your array>);

确保您的Tile课程及其变量是公开的。

public class Tile {
    public int value;
    public int id;
    .
    .
    .
}