我是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" />
你可以在这里阅读更多关于绑定适配器的信息