Почему мой RecyclerView Duplicating Rows находится в kotlin? - PullRequest
0 голосов
/ 02 декабря 2019

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

Fibebase Data Link 1

Выводприложение

с использованием этого кода

    var benefitSpinner = benefitListSpinner

    val spinnerSelection = arrayOf("National", "Texas", "Iowa", "Alabama")

    benefitSpinner.adapter = ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, spinnerSelection)

    benefitSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener{
        override fun onNothingSelected(parent: AdapterView<*>?) {
            location = "National"
        }

        override fun onItemSelected(
            parent: AdapterView<*>?,
            view: View?,
            position: Int,
            id: Long
        ) {

            location = spinnerSelection.get(position)

            fetchNationalBenefits()

        }

    }

}

val benefitMap = LinkedHashMap<String, Benefit>()

private  fun refreshRecyclerViewMessages(){


    benefitMap.values.forEach{
        adapter.add(BenefitItem(it))


    }
}

private fun fetchNationalBenefits() {

    benefitMap.clear()
    adapter.clear()

    val ref = FirebaseDatabase.getInstance().getReference("/$location")
    ref.addChildEventListener(object: ChildEventListener{

        override fun onChildAdded(p0: DataSnapshot, p1: String?) {
            p0.children.forEach{
                val benefitItem = p0.getValue(Benefit::class.java) ?: return

                benefitMap[p0.key!!] = benefitItem

            }
            refreshRecyclerViewMessages()
        }

        override fun onChildChanged(p0: DataSnapshot, p1: String?) {

        }
        override fun onChildMoved(p0: DataSnapshot, p1: String?) {

        }
        override fun onChildRemoved(p0: DataSnapshot) {

        }

        override fun onCancelled(p0: DatabaseError) {

        }
    })
}

}

1 Ответ

0 голосов
/ 02 декабря 2019

onChildAdded вызывается один раз для каждого вашего элемента "/ $ location / *".

Если я правильно понял ваше намерение, вы хотите позвонить adapter.add(item) для каждого такого предмета. Но вместо этого вы звоните refreshRecyclerViewMessages, который добавляет все элементы от benefitMap до adapter каждый раз и создает дубликаты.

Чтобы решить проблему, вы должны получитьизбавьтесь от цикла (forEach вызов) в refreshRecyclerViewMessages, просто добавьте новый элемент, который вы получили в onChildAdded, к адаптеру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...