E/RecyclerView: Адаптер не подключен; пропуск макета / Котлин

#android-studio #kotlin #model-view-controller

Вопрос:

Я читал различные ответы здесь, на stackoverflow, и в этом посте в блоге, и пытался реализовать их решения, но я все еще получаю ошибку. Код взят из учебника по ит. Я надеюсь, что кто — нибудь сможет мне помочь. Спасибо

Ошибка 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

    }
} 
 

Заранее спасибо!!!

Ответ №1:

Это происходит потому, что адаптер подключен к ресайклеру после асинхронной операции включения 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