E/RecyclerView:没有连接适配器;跳过布局 / Kotlin

E/RecyclerView: No adapter attached; skipping layout / Kotlin

我一直在 Whosebug 和此博客 post 上阅读不同的答案,并尝试实施他们的解决方案,但我仍然遇到错误。该代码来自 yt 教程。我希望有一个人可以帮助我。谢谢

错误E/RecyclerView:没有连接适配器;跳过布局

我的适配器

这是我的主Activity

class MainActivity : AppCompatActivity(), IDrinkLoadListener {

    lateinit var drinkLoadListener: IDrinkLoadListener
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        init()
        loadDrinkFromFirebase()

    }

    private fun loadDrinkFromFirebase() {
        val drinkModels : MutableList<DrinkModel> = ArrayList()
        FirebaseDatabase.getInstance()
            .getReference("Drink")
            .addListenerForSingleValueEvent(object: ValueEventListener{
            override fun onDataChange(snapshot: DataSnapshot) {
                if(snapshot.exists()) {
                    for (drinkSnapshot in snapshot.children) {
                        val drinkModel = drinkSnapshot.getValue(DrinkModel::class.java)
                        drinkModel!!.key = drinkSnapshot.key
                        drinkModels.add(drinkModel)
                    }
                    drinkLoadListener.onDrinkLoadSuccess(drinkModels)
                } else
                    drinkLoadListener.onDrinkLoadFailed("Drink items not exist")
            }


            override fun onCancelled(error: DatabaseError) {
                drinkLoadListener.onDrinkLoadFailed(error.message)

            }
        })

    }


    private fun init() {
        drinkLoadListener = this

        val gridLayoutManager = GridLayoutManager(this, 2)
        recycler_drink.layoutManager = gridLayoutManager
        recycler_drink.addItemDecoration(SpaceItemDecoration())

    }

    override fun onDrinkLoadSuccess(drinkModelList: List<DrinkModel>?) {
        val adapter = MyDrinkAdapter(this,drinkModelList!!)
        recycler_drink.adapter = adapter


    }

    override fun onDrinkLoadFailed(message: String?) {
        Snackbar.make(mainLayout,message!!,Snackbar.LENGTH_LONG).show()
    }
}

class SpaceItemDecoration : RecyclerView.ItemDecoration() {

    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecyclerView.State
    ) {
        if(parent.getChildLayoutPosition(view) % 2 != 0)
        {
            outRect.top= 25
            outRect.bottom= -25
        }else outRect.top = 0

    }
} 

提前致谢!!!

发生这种情况是因为适配器在 onDrinkLoadSuccess

上的异步操作后连接到回收器

您可以在 onCreate 期间将适配器连接到回收器,然后 onDrinkLoadSuccess 使用数据更新它。

ListAdapter class 有一个 submit 方法。如果您使用的是普通回收器,通常是这样的:

Recycler ... {
        private val dataList = mutableListOf()

         fun update(list: List<YourType>) {
                   dataList.clear()
                   dataList.addAll(list)
                   notifyDataDetChanged() //important updates the UI
          }
}

还有更具体的更新方式如notifyItemRangeChanged

还有找数据集差异的助手DiffUtil.ItemCallback