GOOGLE ADS

пятница, 13 мая 2022 г.

Как я могу сделать RecyclerView с MVVM

Я пытаюсь сделать 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)
})

Комментариев нет:

Отправить комментарий

Laravel Datatable addColumn returns ID of one record only

Я пытаюсь использовать Yajra Datatable для интеграции DataTable на свой веб-сайт. Я смог отобразить таблицу, но столкнулся с проблемой. В по...