android - 为什么我的 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) {
}
})
}
}
解决方案
onChildAdded
为您的每个“/$location/*”项目调用一次。
如果我理解你的意图是正确的,你想打电话adapter.add(item)
给每一个这样的项目。但是相反,您调用的是每次都refreshRecyclerViewMessages
将所有项目添加benefitMap
到 to并创建重复项。adapter
要解决您必须摆脱循环(forEach
调用)的问题refreshRecyclerViewMessages
,只需将您进入的新项目添加onChildAdded
到适配器中即可。
推荐阅读
- c++ - 带有 NuGet 的 GLFW OpenGL 无法构建
- knime - 在批处理模式下执行 Knime 时出错:未知选项“-workflow”
- c - 用写函数写数据结构
- spring - Autowired JavaMailSender 上的空指针
- r - networkD3 未绘制预期的交互式网络
- vba - 如果我没有 Internet 连接,如何使用 VBA 在我的 Sharepoint 站点上打开文件?
- android - LiveData postValue 的 Mockito verify() 失败
- ruby - 从字符串和数组的数组创建哈希
- c# - 从我们的服务器运行时收到 NLog 错误,但在本地运行很好
- node.js - 如何在 DialogFlow 中包含输入暂停?