簡體   English   中英

為什么我的 RecyclerView 在 kotlin 中重復行?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM