Адаптер представления переработчика Firebase Firestore дублирует список для каждого документа - PullRequest
1 голос
/ 16 октября 2019

Я учусь кодировать и пытаюсь следовать серии сообщений Kotlin Messenger на YT «давайте создадим это приложение».

Я застрял в реализации представления переработчика с использованием Groupie и не могу точно скопировать кодпоскольку серия использует более старую базу данных Firebase, а я использую Firestore.

Я почти на месте, но мой список «ферм» для моего «представления фермы переключателей» дублирует каждый элемент 6 раз, то есть количество документов в коллекции (т.е. я получаю 6 копий каждой фермыимя, а не просто 1).

Я думаю, что это должно быть легко исправить, но я не могу понять это.

Проблема, я думаю, здесь:

    private fun fetchFarms() {
    val db = FirebaseFirestore.getInstance()
    val adapter = GroupAdapter<GroupieViewHolder>()
    db.collection("farms").get().addOnSuccessListener { result ->
        for (document in result) {
            result.forEach {
            Log.d("SwitchFarmActivity","Loaded document: ${document.id} => ${document.data}")
            val farm = it.toObject(Farm::class.java)
            adapter.add(FarmItem(farm))
                }
            }
        recyclerview_switchfarm.adapter = adapter
    }
}

Распечатка журнала на самом деле возвращает два из каждого элемента, за которыми следует целая серия «указатель ViewPostIme 0», «указатель ViewPostIme 1», «указатель ViewPostIme 0», «указатель ViewPostIme 1» ... и т. Д.

Генерируемый класс 'Farm' очень прост:

data class Farm(val farmId: String, val farmName: String, val ownerId: String) {
constructor():this("","","")

}

Это класс FarmItem:

class FarmItem(val farm: Farm): Item<GroupieViewHolder>() {
override fun bind(viewHolder: GroupieViewHolder, position: Int) {
    viewHolder.itemView.farmName_textView_switchFarm.text = farm.farmName
}
override fun getLayout(): Int {
    return R.layout.farm_row_switch_farm
}

Ответы [ 2 ]

0 голосов
/ 19 октября 2019

Хорошо, я думаю, что у меня есть решение, спасибо Нгуену за то, что он указал мне правильное направление.

    private fun fetchFarms() {
    Log.d("SwitchFarmActivity","fetchFarms function called")
    val db = FirebaseFirestore.getInstance()
    val adapter = GroupAdapter<GroupieViewHolder>()
    recyclerview_switchfarm.adapter = adapter
    db.collection("farms").get().addOnSuccessListener { result ->
        val farmList = result.toObjects(Farm::class.java)
        farmList.forEach {
            Log.d("SwitchFarmActivity","Loaded document: $it")
            adapter.add(FarmItem(it))
        }

    }
}

Если у кого-то есть предложения по рефакторингу, пожалуйста, поделитесь. Я все еще не совсем понимаю, почему (для документа в результате) запускался 36 раз вместо 6.

0 голосов
/ 16 октября 2019

Попробуйте.

private fun fetchFarms() {
val farmList = mutableListOf<Farm>()
val db = FirebaseFirestore.getInstance()
val adapter = GroupAdapter<GroupieViewHolder>()
recyclerview_switchfarm.adapter = adapter
db.collection("farms").get().addOnSuccessListener { result ->
    for (document in result) {
        result.forEach {
        Log.d("SwitchFarmActivity","Loaded document: ${document.id} => ${document.data}")
        val farm = it.toObject(Farm::class.java)
        farmList.add(farm)
            }
        }

}
adapter.addItems(farmList)
}

в методе создания GroupAdapter addItems

    fun addItems(list: List<Farm>) {
    itemList.addAll(list)
    notifyDataSetChanged()
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...