OnBindViewHolder () не вызывается после установки списка незанятости из Livedata комнаты - PullRequest
0 голосов
/ 22 января 2020

Я обнаружил аналогичную проблему там , но там не было места Room.

Поэтому я использую LiveData в DAO-Repository-ViewModel (Room Version 2.2.3):

@Query("SELECT * from ...")    
fun getGoods(): LiveData<List<Goods>>

В моем фрагменте есть подписка:

mViewModel.goodsList.observe(viewLifecycleOwner, Observer {goodsList ->            
        mAdapter.setList(goodsList)            
    })

С logcat я вижу, что список не пуст. Внутри списка RecyclerView Adapter setList () тоже не пустой.

fun setList(goodsList: List<Goods>) {
    records = goodsList        
    notifyDataSetChanged()
}

Но метод onBindViewHolder () не вызывается

override fun onBindViewHolder(viewHolder: ViewHolder, i: Int) {
    // I can't get there
    viewHolder.bind(records[i])
}

Я нашел 2 способа решения проблемы, но они как хаки, и я хочу понять, как лучше:

  1. Добавить задержку при получении onChange () LiveData во фрагменте:

    Handler (). postDelayed ({mAdapter. setList (goodsList)}, 200)

  2. Переключение контекста с помощью диспетчера сопрограммы. Основное получение onChange () LiveData во фрагменте.

Где моя ошибка?

1 Ответ

0 голосов
/ 22 января 2020

this:

fun setList(goodsList: List<Goods>) {
    records = goodsList        
    notifyDataSetChanged()
}

должно быть:

fun setList(goodsList: List<Goods>) {
    records.clear()
    records.addAll(goodsList)       
    notifyDataSetChanged()
}

Однако я бы подумал об использовании ListAdpter https://developer.android.com/reference/android/support/v7/recyclerview/extensions/ListAdapter.html с DiffUtil.ItemCallback<Goods> обратный вызов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...