Android 使用适配器模式实现芯片组

Android 使用适配器模式实现芯片组,android,adapter,material-components-android,android-chips,Android,Adapter,Material Components Android,Android Chips,我的片段包含一个芯片组,根据用户的选择动态添加芯片。我希望实现的是一个适配器模式,其中列表暴露给正在创建芯片的适配器,用户可以在列表中添加/删除元素 我找不到任何方法来做到这一点,现在,每当用户与列表交互时,所有的芯片都会被重新创建 为了简洁起见,对代码进行了裁剪 XML文件 // capturing the user's choice <RadioGroup android:id="@+id/vehicles_radio_group"

我的片段包含一个
芯片组
,根据用户的选择动态添加
芯片
。我希望实现的是一个适配器模式,其中
列表
暴露给正在创建
芯片
的适配器,用户可以在列表中添加/删除元素

我找不到任何方法来做到这一点,现在,每当用户与列表交互时,所有的芯片都会被重新创建

为了简洁起见,对代码进行了裁剪

XML文件

// capturing the user's choice
      <RadioGroup
          android:id="@+id/vehicles_radio_group"
          android:onCheckedChanged="@{vehicleViewModel::radioCheckedChanged}">
期待着像

// In fragment class
val adapter = ChipAdapter()
binding.chipGroup.setAdapter(adapter)


// In bindingUtils file
@BindingAdapter("fill_data")
fun RecyclerChipGroup.setData(list : MyListType){
val adapter = this.adapter as ChipAdapter
adapter.submitChipList(list)
}

//XML File
<RecyclerChipGroup
....
app:fill_data = "@{viewModel.dispatchingUnits}"
....
/>

//在片段类中
val适配器=芯片适配器()
binding.chipGroup.setAdapter(适配器)
//在bindingUtils文件中
@BindingAdapter(“填充数据”)
fun RecyclerChipGroup.setData(列表:MyListType){
val adapter=此.adapter作为芯片适配器
适配器提交列表(列表)
}
//XML文件

如何继续?

如果您想要实现基于适配器的芯片列表和比芯片组更多的控件,那么您可以使用RecyclerView将芯片作为一个项目,并以从左到右或从右到左的顺序排列芯片,您可以创建自定义LayoutManager


有关更多详细信息,请访问。此库支持ChipsLayoutManager。

对于动态更改的多个芯片,可以使用material chips()。为了创建一个芯片适配器,你可以访问我确实使用了材料芯片来显示用户的选择,后面的链接似乎是断断续续的。该链接提到了使用回收器视图布局管理器的回购。如果你不想在你的项目中使用库,那么这样做的概念是创建一个recycler视图及其带有芯片的适配器,而不是使用芯片组,因为它将提供recycler视图的所有功能以及比芯片组更大的灵活性。感谢链接,非常有用,考虑到这一点,只是为了使用
recyclerview
而不是
芯片组
,但这给我留下了一个未解的问题,如果我们可以使用
recyclerview
,为什么首先要使用
芯片组
?是的,recyclerview和芯片组有不同的用例,正如您在问题中提到的,您需要一个基于适配器的芯片列表。由于芯片组没有适配器,所以RecyclerView是实现相同目标的最佳方式。
// register an observer and take action

        myViewModel.dispatchingUnits.observe(viewLifecycleOwner) { allPairs ->
            allPairs?.apply {

                with(binding) {
                   // remove the existing chips if any
                    if (selectedPairChipGroup.isNotEmpty()) {
                        selectedPairChipGroup.removeAllViews()
                    }
                  // create new chips
                    allPairs.forEach { chipPair ->
                        createChips(chipPair)
                    }
                }
            }
        }
// In fragment class
val adapter = ChipAdapter()
binding.chipGroup.setAdapter(adapter)


// In bindingUtils file
@BindingAdapter("fill_data")
fun RecyclerChipGroup.setData(list : MyListType){
val adapter = this.adapter as ChipAdapter
adapter.submitChipList(list)
}

//XML File
<RecyclerChipGroup
....
app:fill_data = "@{viewModel.dispatchingUnits}"
....
/>