реализация группы микросхем с шаблоном адаптера

#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 , но это оставляет меня без ответа, зачем вообще иметь a chipgroup , если мы можем пойти с RecyclerView ?

5. Да, представление recycler и chipGroup имеют разные варианты использования, и, как вы упомянули в своем вопросе, вам нужен список чипов на основе адаптера. и поскольку у chipGroup нет адаптера, поэтому RecyclerView — лучший способ достичь той же цели.

Ответ №1:

Если вы хотите получить список чипов на основе адаптера и больше элементов управления, чем ChipGroup, вы можете использовать RecyclerView с чипами в качестве элемента и упорядочивать чипы слева направо или справа налево, вы можете создать пользовательский LayoutManager.

Для получения более подробной информации вы можете посетить https://github.com/BelooS/ChipsLayoutManager . Эта библиотека обеспечивает поддержку ChipsLayoutManager.