#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)
}