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

0s7z1bwu  于 2022-11-30  发布在  Kotlin
关注(0)|答案(1)|浏览(159)

我是Android中MVVM的新手。
是否有办法添加组布局的子视图,如芯片组、无线电组?
假设有来自服务器的此类数据。

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

以下是我目前所做的工作:

主XML

itemViewModels是在RecyclerViewAdapter和listItems之间绑定的自定义绑定适配器

<androidx.recyclerview.widget.RecyclerView
  app:itemViewModels="@{vm.listItem}"
  app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"/>

视图模型

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

项目视图模型

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来实现它吗?

1zmg4dgp

1zmg4dgp1#

因此,您在布局资源中有您的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" />

你可以阅读更多关于绑定适配器here

相关问题