Я пытаюсь сделать recyclerView с помощью mvvm, но в результате получаю пустой recyclerView, помогите, пожалуйста! кт файл:
typeRecy = itemView.findViewById(R.id.typeRecy)
typeRecy.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
typeRecy.setHasFixedSize(true)
typeVM = ViewModelProvider(this)[TypeViewModel::class.java]
typeVM.typeCard.observe(viewLifecycleOwner, Observer {
typeVM.setList()
typeRecy.adapter = recyclerAdapter(it)
})
видМодель:
class TypeViewModel: ViewModel() {
//
private lateinit var typeList: ArrayList<TypeCard>
lateinit var bgType: Array<Int>
lateinit var nameType: Array<String>
var typeCard = MutableLiveData<ArrayList<TypeCard>>()
fun setList(){
bgType= arrayOf(R.drawable.group_1,R.drawable.group_3,R.drawable.group_4,R.drawable.group_2,R.drawable.group_5,R.drawable.group_8)
nameType= arrayOf("Pizza", "Tacos", "Salads","Burgers","Soups", "Drinks")
typeList = arrayListOf()
putTypeData()
//
}
fun putTypeData() {
for(i in nameType.indices){
val type = TypeCard(nameType[i], bgType[i])
typeList.add(type)
}
typeCard.value = typeList
}
}
Решение проблемы
Во-первых, не пересоздавайте свой адаптер каждый раз, когда получаете новые данные. Просто создайте экземпляр onCreate с пустым списком.
typeRecy = itemView.findViewById(R.id.typeRecy)
typeRecy.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
typeRecy.setHasFixedSize(true)
val recyclerAdapter = recyclerAdapter(emptyList())
typeRecy.adapter = recyclerAdapter
typeVM = ViewModelProvider(this)[TypeViewModel::class.java]
Во-вторых, вам не нужны две переменные (typeCard и typeList), а только одна из них, которая будет MutableLiveData:
class TypeViewModel: ViewModel() {
val typeCard = MutableLiveData<ArrayList<TypeCard>>()
fun setList() {
arrayOf(
"Pizza" to R.drawable. group_1,
"Tacos" to R.drawable. group_3,
"Salads" to R.drawable. group_4,
"Burgers" to R.drawable. group_2,
"Soups" to R.drawable. group_5,
"Drinks" to R.drawable. group_8
).map { (nameType, backgroundType) ->
TypeCard(nameType, backgroundType)
}.let(typeCard::postValue)
}
}
Наконец, во фрагменте вам просто нужно наблюдать за typeCardLiveData и в вашем адаптере иметь метод для обновления списка и НЕ вызывать setList каждый раз.
typeRecy = itemView.findViewById(R.id.typeRecy)
typeRecy.layoutManager = LinearLayoutManager(context, LinearLayoutManager.HORIZONTAL, false)
typeRecy.setHasFixedSize(true)
val recyclerAdapter = recyclerAdapter(emptyList())
typeRecy.adapter = recyclerAdapter
typeVM = ViewModelProvider(this)[TypeViewModel::class.java]
typeVM.setList()
typeVM.typeCard.observe(viewLifecycleOwner, Observer {
recyclerAdapter.updateList(it)
})
Комментариев нет:
Отправить комментарий