使用适配器模式实现 ChipGroup

implementing a ChipGroup with adapter pattern

我的片段包含一个 ChipGroupchips 是根据用户的选择动态添加的。我希望完成的是一个适配器模式,其中 list 暴露给正在创建 chips 的适配器,用户可以从列表中获取 add/remove 元素。

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

为简洁起见,代码已被删减

XML 文件

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

ViewModel

fun radioCheckedChanged(radioGroup: RadioGroup, checkedId: Int) {

        //validating the user's choice
            if (condition) {
                //code for adding the choice to a List
                vehicleDispatched(selectedVehicle, checkedId)   
            } else {
                selectionError()
            }
    }

    // adding the user's choice to the list
    // _dispatchingUnits is a LiveData

    private fun vehicleDispatched(selectedVehicle: DomainVehicle, checkedId: Int) {
  
     // appending the selected choice to the list(Type : List<Pair<Vehicle,Planet>>)
        _dispatchingUnits.value =
            _dispatchingUnits.value?.plus(selectedVehicle to _currentPlanet.value!!)
                ?: listOf(selectedVehicle to _currentPlanet.value!!)
    }

片段

// 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}"
....
/>

如何进行下去?

如果你想实现基于适配器的芯片列表和比 ChipGroup 更多的控件,那么你可以将 RecyclerView 与芯片一起使用,并以从左到右或从右到左的顺序排列芯片,你可以创建自定义 LayoutManager。

更多详情,您可以访问https://github.com/BelooS/ChipsLayoutManager。此库提供对 ChipsLayoutManager 的支持。