#android #adapter #material-components-android #android-chips
#Android #адаптер #материал-компоненты-android #android-чипы
Вопрос:
Мой фрагмент содержит a ChipGroup
, chips
который добавляется динамически на основе выбора пользователя. Чего я хочу добиться, так это шаблона адаптера, в котором a list
предоставляется адаптеру, из которого chips
создается пользователь, который может добавлять / удалять элементы в список и из него.
Я не мог найти никакого способа сделать это, и прямо сейчас, всякий раз, когда пользователь взаимодействует со списком, все чипы воссоздаются.
Код был обрезан для краткости
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}"
....
/>
как продолжить с этим?
Комментарии:
1. для динамического изменения нескольких микросхем можно использовать микросхемы материалов ( material.io/components/chips ). для создания адаптера для микросхем вы можете посетить douevencode.com/articles/2017-06 /…
2. Я действительно использовал материальные чипы для отображения выбора пользователей, и более поздняя ссылка, похоже, нарушена
3. О, хорошо. Эта ссылка упоминалась github.com/BelooS/ChipsLayoutManager это репозиторий, который использует диспетчер компоновки представления Recycler. если вы не хотите использовать библиотеку в своем проекте, то концепция для этого заключается в создании представления recycler и его адаптера с чипами вместо использования chipGroup, поскольку это обеспечит все возможности recycler view и большую гибкость, чем chipGroup.
4. Спасибо за ссылку, довольно полезную, подумал о том же, просто использовать a
recyclerview
вместоchipgroup
, но это оставляет меня без ответа, зачем вообще иметь achipgroup
, если мы можем пойти сRecyclerView
?5. Да, представление recycler и chipGroup имеют разные варианты использования, и, как вы упомянули в своем вопросе, вам нужен список чипов на основе адаптера. и поскольку у chipGroup нет адаптера, поэтому RecyclerView — лучший способ достичь той же цели.
Ответ №1:
Если вы хотите получить список чипов на основе адаптера и больше элементов управления, чем ChipGroup, вы можете использовать RecyclerView с чипами в качестве элемента и упорядочивать чипы слева направо или справа налево, вы можете создать пользовательский LayoutManager.
Для получения более подробной информации вы можете посетить https://github.com/BelooS/ChipsLayoutManager . Эта библиотека обеспечивает поддержку ChipsLayoutManager.