In meinem Fragment werden oben Chips dargstellt mit Kategorien und darunter eine Recyclerview mit Zutaten.
Die Chips werden im Observer vom ViewModel dynamisch erstellt und zur Chipgroup hinzugefügt. Auf der Chipgroup liegt ein OnCheckedChangeListener welcher je nach gewählten Chip anhand des Namens die Recyclerview filtert und die zugehörigen Zutaten anzeigt.
Das Problem besteht darin, dass wenn das Fragment verlassen und wieder neu geöffnet wird die Funktion mir eine falsche ID liefert, mit der ich nichts anfangen kann, da sie nicht in der Range der vorhandenen Chips liegt.
Die ID verhält sich wie folgt:
Erster Start des Fragments -> Chip wird gewählt -> ID: 1 (erstes Item gewählt) -> korrekt
-> Verlassen des Fragments und wieder öffnen -> Chip geewählt -> ID: 10 (erstes Item gewählt) -> ... -> ID: 19.. -> ID:28 .. usw
Irgendwie wird die ID immer um die Anzahl der vorhandenen Chips erhöht. Bei näherer Untersuchung wird die ID durch die Funktion "getResourceId(@StyleableRed int index, int defValue) ermittelt.
Hat jemand eine ID wie ich sonst vorgehen kann um die Liste mit den Chips zu filtern oder das Problem zu beheben?
Fragment Code:
class BlankFragment2 : Fragment() {
private var ingredientViewModel : IngredientViewModel? = null
private var categoryViewModel : CategoryViewModel? = null
private var adapter : IngredientAdapter? = null
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setHasOptionsMenu(true)
ingredientViewModel = ViewModelProvider(activity!!).get(IngredientViewModel::class.java)
categoryViewModel = ViewModelProvider(activity!!).get(CategoryViewModel::class.java)
adapter = IngredientAdapter(context!!)
}
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
return inflater.inflate(R.layout.fragment_blank2, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
(activity as AppCompatActivity).setSupportActionBar(bottombar)
(activity as AppCompatActivity).supportActionBar!!.setDisplayHomeAsUpEnabled(true)
setObserver(adapter!!)
rvIngs.adapter = adapter
rvIngs.layoutManager = GridLayoutManager(context, 2)
chipgroup.setOnCheckedChangeListener { p0, p1 ->
if(p1 != -1){
adapter!!.filter.filter((p0[p1-1] as Chip).text)
} else {
adapter!!.filter.filter(null)
}
}
}
private fun setObserver(adapter: IngredientAdapter){
ingredientViewModel!!.getIngs().observe(viewLifecycleOwner, Observer {
adapter!!.setIngCopyList(it)
adapter!!.submitList(it)
})
categoryViewModel!!.getCats().observe(viewLifecycleOwner, Observer {
adapter.setCatCopyList(it)
for (cat in it){
val chip = layoutInflater.inflate(R.layout.chip_style, chipgroup, false) as Chip
chip.text = cat.catName
chip.isCheckable
chip.isClickable
chipgroup.addView(chip)
}
})
}
override fun onCreateOptionsMenu(menu: Menu, inflater: MenuInflater) {
inflater.inflate(R.menu.ing_bot_menu, menu)
super.onCreateOptionsMenu(menu, inflater)
}
override fun onOptionsItemSelected(item: MenuItem): Boolean {
when (item.itemId) {
android.R.id.home -> findNavController().navigateUp()
}
return super.onOptionsItemSelected(item)
}
}
Alles anzeigen
EDIT:
Habe die Lösung gefunden. Die ID ist nicht zuverlässig, allerdings kann mit "chip.id" oder "chip.tag" eine Zusatzinfo mitgegeben werden, welche dann verwendet werden kann um enstprechend weiterzumachen