Material 筹码:java.lang.IndexOutOfBoundsException 当检查任何筹码时
Material Chips: java.lang.IndexOutOfBoundsException when checked any of the chips
我有一个 chip group,我的 AddItemFragment
里有一些筹码。我正在以编程方式创建这些芯片。更准确地说,这是我创建它们的代码:
mViewModel.categories.observe(viewLifecycleOwner) { resource ->
handleResource(
resource = resource,
successFunc = {
setCategoryChips(resource.data!!)
},
errorFunc = {
requireView().snack(resource.message!!, R.color.color_danger)
}
)
}
private fun setCategoryChips(categories: List<Kitchen>) {
for (i in categories.indices) {
val chip = layoutInflater.inflate(R.layout.my_chip, binding.chipGroup, false) as Chip
if (i == 0) {
selectedChip = chip.text.toString()
chip.isChecked = true
}
chip.text = categories[i].name
binding.chipGroup.addView(chip)
}
binding.chipGroup.setOnCheckedChangeListener { group, checkedId ->
if (group.childCount > 0) {
selectedChip = (group.get(checkedId -1) as Chip).text.toString()
Log.i(TAG, "setCategoryChips: $selectedChip")
}
}
}
如您所见,我正在从服务器获取一个列表,然后根据该列表创建筹码。我正在使用以下方式获取已检查芯片的文本:
binding.chipGroup.setOnCheckedChangeListener { group, checkedId ->
if (group.childCount > 0) {
selectedChip = (group.get(checkedId -1) as Chip).text.toString()
Log.i(TAG, "setCategoryChips: $selectedChip")
}
}
我第一次导航到 AddItemFragment
时,此方法按预期工作。但是,当我导航到另一个目的地然后再次导航回 AddItemFragment
时,如果我检查任何筹码,我都会收到此错误
java.lang.IndexOutOfBoundsException: Index: 29, Size: 28
at androidx.core.view.ViewGroupKt.get(ViewGroup.kt:32)
at com.example.semekyepeti.view.fragments.sellerflow.AddItemFragment$setKitchenChips.onCheckedChanged(AddItemFragment.kt:183)
at com.google.android.material.chip.ChipGroup.setCheckedId(ChipGroup.java:362)
at com.google.android.material.chip.ChipGroup.setCheckedId(ChipGroup.java:355)
at com.google.android.material.chip.ChipGroup.access0(ChipGroup.java:56)
at com.google.android.material.chip.ChipGroup$CheckedStateTracker.onCheckedChanged(ChipGroup.java:546)
at com.google.android.material.chip.Chip.setChecked(Chip.java:714)
at android.widget.CompoundButton.toggle(CompoundButton.java:135)
at android.widget.CompoundButton.performClick(CompoundButton.java:140)
我意识到当我导航到另一个目的地然后再次导航回 AddItemFragment
时,checkedId
会自行递增。
I/AddItemFragment: navigate 0 time
I/AddItemFragment: checkedId: 2
I/AddItemFragment: item count: 28
I/AddItemFragment: navigate 1 time
I/AddItemFragment: checkedId: 30
I/AddItemFragment: item count: 28
所以我将 checkedId -1
更改为 (checkedId - listCount * navigateCount) -1
来处理这个问题:
binding.chipGroup.setOnCheckedChangeListener { group, checkedId ->
if (group.childCount > 0) {
selectedChip =
(group.get((checkedId - 28 * navigateCount) - 1) as Chip).text.toString() //workaround
}
}
但是我知道这是inefficient.I想要得到被勾选的芯片的文本。我该如何解决?
你得到的 checkedId 显然是一个视图 ID,你应该用 findViewById
获取实际的筹码。您将其用作视图组中的索引,不一定会匹配(但有时会匹配!)
没有文档实际上没有解释这个
我有一个 chip group,我的 AddItemFragment
里有一些筹码。我正在以编程方式创建这些芯片。更准确地说,这是我创建它们的代码:
mViewModel.categories.observe(viewLifecycleOwner) { resource ->
handleResource(
resource = resource,
successFunc = {
setCategoryChips(resource.data!!)
},
errorFunc = {
requireView().snack(resource.message!!, R.color.color_danger)
}
)
}
private fun setCategoryChips(categories: List<Kitchen>) {
for (i in categories.indices) {
val chip = layoutInflater.inflate(R.layout.my_chip, binding.chipGroup, false) as Chip
if (i == 0) {
selectedChip = chip.text.toString()
chip.isChecked = true
}
chip.text = categories[i].name
binding.chipGroup.addView(chip)
}
binding.chipGroup.setOnCheckedChangeListener { group, checkedId ->
if (group.childCount > 0) {
selectedChip = (group.get(checkedId -1) as Chip).text.toString()
Log.i(TAG, "setCategoryChips: $selectedChip")
}
}
}
如您所见,我正在从服务器获取一个列表,然后根据该列表创建筹码。我正在使用以下方式获取已检查芯片的文本:
binding.chipGroup.setOnCheckedChangeListener { group, checkedId ->
if (group.childCount > 0) {
selectedChip = (group.get(checkedId -1) as Chip).text.toString()
Log.i(TAG, "setCategoryChips: $selectedChip")
}
}
我第一次导航到 AddItemFragment
时,此方法按预期工作。但是,当我导航到另一个目的地然后再次导航回 AddItemFragment
时,如果我检查任何筹码,我都会收到此错误
java.lang.IndexOutOfBoundsException: Index: 29, Size: 28
at androidx.core.view.ViewGroupKt.get(ViewGroup.kt:32)
at com.example.semekyepeti.view.fragments.sellerflow.AddItemFragment$setKitchenChips.onCheckedChanged(AddItemFragment.kt:183)
at com.google.android.material.chip.ChipGroup.setCheckedId(ChipGroup.java:362)
at com.google.android.material.chip.ChipGroup.setCheckedId(ChipGroup.java:355)
at com.google.android.material.chip.ChipGroup.access0(ChipGroup.java:56)
at com.google.android.material.chip.ChipGroup$CheckedStateTracker.onCheckedChanged(ChipGroup.java:546)
at com.google.android.material.chip.Chip.setChecked(Chip.java:714)
at android.widget.CompoundButton.toggle(CompoundButton.java:135)
at android.widget.CompoundButton.performClick(CompoundButton.java:140)
我意识到当我导航到另一个目的地然后再次导航回 AddItemFragment
时,checkedId
会自行递增。
I/AddItemFragment: navigate 0 time
I/AddItemFragment: checkedId: 2
I/AddItemFragment: item count: 28
I/AddItemFragment: navigate 1 time
I/AddItemFragment: checkedId: 30
I/AddItemFragment: item count: 28
所以我将 checkedId -1
更改为 (checkedId - listCount * navigateCount) -1
来处理这个问题:
binding.chipGroup.setOnCheckedChangeListener { group, checkedId ->
if (group.childCount > 0) {
selectedChip =
(group.get((checkedId - 28 * navigateCount) - 1) as Chip).text.toString() //workaround
}
}
但是我知道这是inefficient.I想要得到被勾选的芯片的文本。我该如何解决?
你得到的 checkedId 显然是一个视图 ID,你应该用 findViewById
获取实际的筹码。您将其用作视图组中的索引,不一定会匹配(但有时会匹配!)
没有文档实际上没有解释这个