使用适配器模式实现 ChipGroup
implementing a ChipGroup with adapter pattern
我的片段包含一个 ChipGroup
,chips
是根据用户的选择动态添加的。我希望完成的是一个适配器模式,其中 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 的支持。
我的片段包含一个 ChipGroup
,chips
是根据用户的选择动态添加的。我希望完成的是一个适配器模式,其中 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 的支持。