#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