首页 > 解决方案 > 为什么我的 RecyclerView 在 kotlin 中重复行?

问题描述

我正在检索下面链接中显示的 Firebase 数据。RecyclerView 显示了应该是一行的多个副本,我不知道为什么。数据库中每个部分的 key 应该与 RecyclerView 中每一行的标题相同。

Fibebase 数据链接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) {

        }
    })
}

}

标签: androidkotlinandroid-recyclerview

解决方案


onChildAdded为您的每个“/$location/*”项目调用一次。

如果我理解你的意图是正确的,你想打电话adapter.add(item)给每一个这样的项目。但是相反,您调用的是每次都refreshRecyclerViewMessages所有项目添加benefitMap到 to并创建重复项。adapter

要解决您必须摆脱循环(forEach调用)的问题refreshRecyclerViewMessages,只需将您进入的新项目添加onChildAdded到适配器中即可。


推荐阅读