[英]Why is my RecyclerView Duplicating Rows in kotlin?
我正在检索下面链接中显示的 Firebase 数据。 RecyclerView 显示了应该是一行的多个副本,我不明白为什么。 数据库中每个部分的键应该与 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) {
}
})
}
}
onChildAdded
为您的每个“/$location/*”项目调用一次。
如果我理解你的意图是正确的,你想为每个这样的项目调用adapter.add(item)
。 但是,您调用的是refreshRecyclerViewMessages
,它每次都会将所有项目从benefitMap
添加到adapter
,并创建重复项。
要解决此问题,您必须摆脱 refreshRecyclerViewMessages 中的循环( forEach
调用),只需将您在refreshRecyclerViewMessages
中获得的新项目onChildAdded
到适配器中。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.