如何在MVVM Android中动态创建子视图?



我是Android中的MVVM新手。
是否有一种方法来添加组布局的子视图,如chipgroup, radiogroup?
假设有这样一个来自服务器的数据。

[name: 'coffee', size: 'tall', 'grande', 'venti' ...,
name: 'pizza', size: 'small', 'medium', 'large' ...]

main XML
itemViewModels是一个自定义的BindingAdapter,用于在RecyclerViewAdapter和listtitems之间绑定
<androidx.recyclerview.widget.RecyclerView
app:itemViewModels="@{vm.listItem}"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"/>

ViewModel

val listItem = MutableLiveData<List<ItemViewModel>>(...)
listItem= ... // get data and convert into view data blabla

ItemViewModel

class ItemViewModel() {
val name:String
val size:List<String>
}

条目XML

<TextView android:text="@{itemViewModel.data.name}" .../>
<com.google.android.material.chip.ChipGroup
android:id="@+id/chipGroupSizeOption">
<!-- I would like to add child views of chipgroup here -->
</com.google.android.material.chip.ChipGroup>

在MVC模式中,我会这样写

binding.chipGroupSizeOption.removeAllViews()
SizeOptionsDataFromServer.forEach { x->
val chip= (LayoutInflater.from(context).inflate(R.layout.chip_item, 
binding.chipGroupSizeOption, false) as Chip)
.apply {
text = x.data.name
id = ViewCompat.generateViewId()
}
}
binding.chipGroupSizeOption.addView(chip)

但在MVVM中,是否可以添加具有数据绑定的子视图?
我应该使用BindingAdapter来实现这个吗?

所以,你有你的list_view_item在你的布局资源。在这个项目布局中,有一个芯片组将显示来自对象的列表。例子User.nicknames

我猜在这个list_view_item布局中,您已经定义了对象变量。就像

<layout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<data>
<variable
name="user"
type="com.myapp.data.User" />
</data>
<ConstraintLayout... /> <!-- UI layout's root element -->

现在,创建一个绑定适配器,您可以通过创建一个新的kotlin文件来实现,该文件将包含所有适配器,它将采用一个chipGroup和要显示的项列表。这是我用例中的一个

@BindingAdapter("childChipValues")
fun bindChildChips(chipGroup: ChipGroup, childChipValues:List<String>) {
childChipValues.forEach{ value ->
val chip = Chip(chipGroup.context)
chip.text = value
chipGroup.addView(chip)
}
}

接下来,您要做的是回到chipGroup布局并使用适配器。就像

<com.google.android.material.chip.ChipGroup
android:id="@+id/levels"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
app:childChipValues="@{user.nicknames}"
app:singleSelection="false" />

你可以在这里阅读更多关于绑定适配器的信息

最新更新