Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
For loop 如何阻止回收器视图在实际结果之前重复循环项目?_For Loop_Kotlin_Firebase Realtime Database_Android Recyclerview_Duplicates - Fatal编程技术网

For loop 如何阻止回收器视图在实际结果之前重复循环项目?

For loop 如何阻止回收器视图在实际结果之前重复循环项目?,for-loop,kotlin,firebase-realtime-database,android-recyclerview,duplicates,For Loop,Kotlin,Firebase Realtime Database,Android Recyclerview,Duplicates,我有一个嵌套的回收器视图,它从firebase获取数据。有一个for循环运行,试图将同一练习的所有集合放入一张卡中。循环似乎工作正常,但是,recycler视图显示了for循环的整个过程。例如,如果有三个项目要添加到一张卡上,它会显示三张卡,其中第三张卡是所需的实际结果,前两张卡不是所需的(因此第一张卡有1张,第二张卡有2张,第三张卡有实际的3张)。我尝试添加了一个clear函数,它产生了我想要的结果,但是只有一次,如果我尝试添加一个新的练习,它就会被替换 private fun initRe

我有一个嵌套的回收器视图,它从firebase获取数据。有一个for循环运行,试图将同一练习的所有集合放入一张卡中。循环似乎工作正常,但是,recycler视图显示了for循环的整个过程。例如,如果有三个项目要添加到一张卡上,它会显示三张卡,其中第三张卡是所需的实际结果,前两张卡不是所需的(因此第一张卡有1张,第二张卡有2张,第三张卡有实际的3张)。我尝试添加了一个clear函数,它产生了我想要的结果,但是只有一次,如果我尝试添加一个新的练习,它就会被替换

 private fun initRecycler() {
    val date = Calendar.getInstance().time
    val currentTime = SimpleDateFormat("dd-MM-yyyy", Locale.US).format(date)
    recyclerView = findViewById<SuperRecyclerView>(R.id.rv_sync)
    val layoutManager = LinearLayoutManager(applicationContext)
    recyclerView!!.setLayoutManager(layoutManager)
    adapter = ParentAdapter(
        ArrayList()//mutableListOf<ParentModel>()
    )

    recyclerView.adapter = adapter


    val syncedWorkOutReference = FirebaseDatabase.getInstance().reference
        .child("Synced Workouts").child(userIds).child(currentTime)

    //TODO this is the code that needs fixing*********************



    syncedWorkOutReference.addValueEventListener(object : ValueEventListener {
        override fun onDataChange(p0: DataSnapshot) {

            val addedIds = mutableListOf<String>()
            val parents = mutableListOf<ParentModel>()


            for (word in p0.children) {


//      (parents as ArrayList<ParentModel>).clear()  ---- this produces the desired result, but shows only one card which is replaced if i try adding another. 

                val sets = word.getValue(FbTrackData::class.java)
                val children = mutableListOf<ChildModel>()
                for (word1 in p0.children) {
                    val sets1 = word1.getValue(FbTrackData::class.java)
                    if (sets1!!.exercise == sets!!.exercise && !addedIds.contains(
                            sets.setId
                        )
                    ) {
                        addedIds.add(sets1.setId)
                        val child = ChildModel(sets1.weight, sets1.reps)
                        children.add(child)
                    }
                }
                val parent = ParentModel(
                    sets!!.exercise,
                    children
                )
                if (parent.children.isNotEmpty()) {
                    parents.add(parent)

                }

            }
            adapter.setParents(parents)

        }



        override fun onCancelled(p0: DatabaseError) {

        }

    })

}
private fun initRecycler(){
val date=Calendar.getInstance().time
val currentTime=SimpleDataFormat(“dd-MM-yyyy”,Locale.US)。格式(日期)
recyclerView=findViewById(R.id.rv\u同步)
val layoutManager=LinearLayoutManager(applicationContext)
回收视图!!.setLayoutManager(layoutManager)
适配器=父适配器(
ArrayList()//mutableListOf()
)
recyclerView.adapter=适配器
val syncedWorkOutReference=FirebaseDatabase.getInstance().reference
.child(“同步训练”).child(用户ID).child(当前时间)
//TODO这是需要修复的代码*********************
SyncedWorkUtReference.addValueEventListener(对象:ValueEventListener{
覆盖数据更改(p0:DataSnapshot){
val addedIds=mutableListOf()
val parents=mutableListOf()
for(p0.children中的单词){
//(parents as ArrayList).clear()——这将生成所需的结果,但仅显示一张卡,如果我尝试添加另一张卡,该卡将被替换。
val sets=word.getValue(FbTrackData::class.java)
val children=mutableListOf()
for(p0.children中的单词1){
val sets1=word1.getValue(FbTrackData::class.java)
如果(sets1!!.exercise==sets!!.exercise&&!addedIds.contains)(
sets.setId
)
) {
addedIds.add(set1.setId)
val child=ChildModel(设置1.weight,设置1.reps)
children.add(child)
}
}
val parent=ParentModel(
集合!!练习,
儿童
)
if(parent.children.isNotEmpty()){
父对象。添加(父对象)
}
}
adapter.setParents(父级)
}
已取消覆盖乐趣(p0:DatabaseError){
}
})
}
错误结果的图像:

所需结果的图像:(添加clear函数时发生,但在添加新项时被替换):


在期望的结果图像中,我通过在for循环中添加一个clear函数实现了这一点,但是,如果我添加一个新的练习,它会导致卡被替换。当清除被删除时,它会在另一个图像中产生不希望的结果。我应该如何处理这个循环?

我通过改变向适配器发送数据的方式解决了这个问题。我没有发送包含标题和子模型(包含权重和重复次数)的父模型,而是将标题的数组列表发送到适配器,然后在父适配器中,查询firebase以获取与标题匹配的第二组数据,并从那里将其发送到子适配器