[英]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.