如何使用 Android 数据绑定来填充列表?

Tra*_*ell 5 java android mvvm android-xml android-databinding

我可以从 ORM(Cupboard)中获取 POJO,但我不知道如何编写 xml 来绑定到这样的列表。除了非常简短地提到在 ListView 或 RecyclerView 中使用它们之外,所有示例都是单一的。因此,我尝试在 xml 文件中使用单一绑定,并为每个项目再次“膨胀”。该代码如下:

private void listThings() {

  LinearLayout gList = (LinearLayout) findViewById(R.id.thingList);
  gList.removeAllViews();

  SQLiteDatabase db = new CGDatabaseHandler(gList.getContext()).getReadableDatabase();
  DatabaseCompartment dbc = cupboard().withDatabase(db);

  QueryResultIterable<Thing> itr = null;
  try {
    itr = dbc.query(Thing.class).query();

    for (Thing thing : itr) {
      // use data binding to create a UI widget for each
      LayoutInflater inflater = (LayoutInflater) getBaseContext()
          .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
      ThingDocumentLabelBinding binding = DataBindingUtil.inflate(inflater,
          R.layout.thing_document_label, gList, false);
      binding.setThing(thing);
      // 
      gList.addView(binding.getRoot());
    }
  } finally {
    // close the cursor
    if (itr != null)
      itr.close();
  }
}
Run Code Online (Sandbox Code Playgroud)

我知道这使用 LinearLayout 而不是 ListView 或 RecyclerView。有什么不同?我根本无法在 ListView 中显示任何内容。ListView似乎也不支持使用removeAllViews清除列表。这是文件 thing_document_label.xml 的 XML

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

  <data>
    <variable
        name="thing"
        type="com.example.Thing"/>
  </data>

  <TextView android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:paddingBottom="20dp"
            android:paddingTop="20dp"
            android:text="@{@string/thing_document_label(thing.gName, thing.dstName, thing.property3)}"
      >

  </TextView>
</layout>
Run Code Online (Sandbox Code Playgroud)

我得到的是 LinearLayout 中显示的单个 TextView。我应该会见他们六个。在我开始尝试进行数据绑定之前,我已经让它们出现了。我刚刚对 TextView 进行了子类化,并在此处所示的同一循环中实例化了它们。这工作得很好,但我正处于这个应用程序的开始阶段,如果可能的话,我想标准化数据绑定。

Quố*_*ùng 0

RecyclerView对我来说,我解决了使用的更新项目@BindingAdapter

构建基础适配器:

abstract class BaseAdapter<Item, VH : ViewHolder> : Adapter<VH>() {
    abstract fun setItems(items: List<Item>)
}


@BindingAdapter("items")
fun <Item> updateItems(view: RecyclerView, items: List<Item>) {
    (view.adapter as? BaseAdapter<Item, in ViewHolder>)?.setItems(items)
}
Run Code Online (Sandbox Code Playgroud)

调用绑定:

        <androidx.recyclerview.widget.RecyclerView
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            app:layoutManager="@{layoutManager}"
            android:adapter="@{adapter}"
            items="@{viewModel.items}"/>
Run Code Online (Sandbox Code Playgroud)