首页 > 解决方案 > E/RecyclerView:没有附加适配器;跳过布局 / Kotlin

问题描述

我一直在 stackoverflow 和这篇博客文章上阅读不同的答案,并尝试实施他们的解决方案,但我仍然收到错误消息。代码来自 yt 教程。我希望有一个人可以帮助我。谢谢

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

我的适配器

这是我的主要活动

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

    }
} 

提前致谢!!!

标签: android-studiokotlinmodel-view-controller

解决方案


发生这种情况是因为适配器在异步操作后附加到回收器onDrinkLoadSuccess

您可以在期间将适配器附加到回收器onCreate,然后onDrinkLoadSuccess使用数据对其进行更新。

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

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

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

还有更具体的更新方法notifyItemRangeChanged,例如等。

也有帮助发现数据集的差异DiffUtil.ItemCallback


推荐阅读