繁体   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