Как установить действие для другого элемента, не выбранного в Recyclerview

#android #android-recyclerview

#Android #android-recyclerview

Вопрос:

Я использую библиотеку адаптера представления переработчика для отображения моего списка в представлении переработчика. У меня есть еще один флажок, который я показываю. Я хочу установить флажок одновременно. Как только я устанавливаю флажок, любой ранее установленный флажок должен быть снят.

Библиотека адаптера

https://github.com/utsmannn/Recycling

Код

 
    val genderList = resources.getStringArray(R.array.gender_list).toList()
    gender_rv.setupAdapter<String>(R.layout.specialty_layout_item){adapter, context, list ->
        bind { itemView, position, item ->
            itemView.specialty_item_checkbox.show()
            itemView.specialty_item_checkbox.text = item

            if (itemView.specialty_item_checkbox.isChecked){
                genderValue  = itemView.specialty_item_checkbox.text.toString().toLowerCase()
            }
        }
        setLayoutManager(LinearLayoutManager(requireContext(), LinearLayoutManager.HORIZONTAL, true))
        submitList(genderList)
    }

  

Ответ №1:

Что я сделал в одном из своих проектов, так это:

 fun bind(item: Item, onItemToggled: (Item) -> Unit) {
        itemView.checkbox.setOnCheckedChangeListener(null)
        itemView.checkbox.isChecked = item.selected
        itemView.checkbox.setOnCheckedChangeListener { compoundButton, b ->
            onItemToggled(item.copy(selected = !item.selected))
        }
}
  

Если вы хотите, чтобы был отмечен только один элемент, я бы сопоставил список, чтобы убедиться, что выбран только один элемент:

 data class RecyclerItem(val text: String, val selected: Boolean = false)

var genderList = resources.getStringArray(R.array.gender_list).toList().map {
    RecyclerItem(text = it)
}
gender_rv.setupAdapter<String>(R.layout.specialty_layout_item){adapter, context, list ->
        bind { itemView, position, item ->
            itemView.specialty_item_checkbox.show()
            itemView.specialty_item_checkbox.text = item.text
          itemView.specialty_item_checkbox.setOnCheckedChangeListener(null)
            itemView.specialty_item_checkbox.isChecked = item.selected
            itemView.checkbox.specialty_item_checkbox { compoundButton, b ->
            genderList = genderList.map {
                if(it == item) {
                    it.copy(selected = !item.selected)
                } else {
                    it.copy(selected = false)
                }
            adapter.submitList(genderList)
        }
    }
  

Ответ №2:

Я смог справиться с этим, используя приведенный ниже метод.

 var genderList = resources.getStringArray(R.array.gender_list).toList().map {
            RecyclerItem(text = it)
        }
        val checkboxes = arrayListOf<CheckBox>()

        gender_rv.setupAdapter<RecyclerItem>(R.layout.specialty_layout_item) { adapter, context, list ->
            bind { itemView, position, item ->
                itemView.specialty_item_checkbox.show()
                itemView.specialty_item_checkbox.text = item?.text
                itemView.specialty_item_checkbox.isChecked = item?.selected!!

                checkboxes.add(itemView.specialty_item_checkbox)
                itemView.specialty_item_checkbox.setOnCheckedChangeListener { compoundButton, b ->
                    if (b) {
                        compoundButton.isChecked = true
                        val otherCheckboxes =
                            checkboxes.filter { checkBox -> checkBox.text != compoundButton.text }
                        otherCheckboxes.forEach { checkbox ->
                            if (checkbox.isChecked) {
                                checkbox.isChecked = !checkbox.isChecked
                            } else {

                            }
                        }
                        val sz = otherCheckboxes.size
                        Log.i("checkbox", "hello ${compoundButton.text} othersSize $sz")
                    }


                }

            }
            setLayoutManager(
                LinearLayoutManager(
                    requireContext(),
                    LinearLayoutManager.HORIZONTAL,
                    false
                )
            )
            submitList(genderList)
        }