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 进行了子类化,并在此处所示的同一循环中实例化了它们。这工作得很好,但我正处于这个应用程序的开始阶段,如果可能的话,我想标准化数据绑定。
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)
| 归档时间: |
|
| 查看次数: |
1480 次 |
| 最近记录: |