J'ai trouvé un problème similaire , mais il n'y avait pas de pièce impliquée.

J'utilise donc LiveData dans DAO-Repository-ViewModel (Room Version 2.2.3) :

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

Dans mon fragment, il y a un abonnement :

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

Avec logcat, je peux voir que la liste n'est pas vide. La liste setList() de l'adaptateur RecyclerView n'est pas vide non plus.

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

Mais la méthode onBindViewHolder() n'est pas appelée

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

J'ai trouvé 2 façons de résoudre le problème mais elles ressemblent à des hacks et je veux mieux comprendre :

  1. Ajoutez un délai pour obtenir le onChange() de LiveData en fragment :

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

  2. Changez de contexte avec Dispatchers.Main de coroutine pour obtenir onChange() de LiveData en fragment.

Où est mon erreur?

0
sergiy tikhonov 22 janv. 2020 à 16:56

1 réponse

Meilleure réponse

Cette :

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

Devrait être :

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

Cependant, je penserais à utiliser un ListAdpter https://developer.android.com/reference/android/support/v7/recyclerview/extensions/ListAdapter.html avec un rappel DiffUtil.ItemCallback<Goods>.

0
Mark Keen 22 janv. 2020 à 14:12