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 获取实际的筹码。您将其用作视图组中的索引,不一定会匹配(但有时会匹配!)

没有文档实际上没有解释这个