地图在Firebase onDataChange在Kotlin

我的代码数星星(5星)在firebase和我有问题,如果它实时更新它计数不正确

(现在的Firebase)

  1. = 1
  2. = 2
  3. = 0
  4. = 0
  5. = 0

而且改变firebase后[add 1. + = 1]

  1. = 3
  2. = 4
  3. = 0
  4. = 0
  5. = 0

但是,如果我重新启动应用程序更改为正常的结果

  1. = 2
  2. = 2
  3. = 0
  4. = 0
  5. = 0

为什么MutableMap第二次添加新星图?

class FireBaseRealTime { var listofStarsCounter : ArrayList = ArrayList(listOf(0,0,0,0,0)) var mDataBase : DatabaseReference = FirebaseDatabase.getInstance().getReference() var mDeviceLikesRef = mDataBase.child("service").child("devices").child("sam").child("likes") fun allAverageLike(text: TextView,star1: TextView,star2: TextView,star3: TextView,star4: TextView,star5: TextView) { var count : Int = 0 var sumAllvalue : Int = 0 mDeviceLikesRef.addValueEventListener(object : ValueEventListener{ override fun onCancelled(p0: DatabaseError?) { TODO("not implemented") //To change body of created functions use File | Settings | File Templates. } override fun onDataChange(dataSnapshot: DataSnapshot?) { dataSnapshot?.children?.forEach { child : DataSnapshot -> val objectMap : MutableMap objectMap = child.value as MutableMap for(entary in objectMap) { if(entary.key.equals("value")) { when(entary.value.toString()){ "1" -> listofStarsCounter.set(0, listofStarsCounter.get(0) + 1) "2" -> listofStarsCounter.set(1, listofStarsCounter.get(1) + 1) "3" -> listofStarsCounter.set(2, listofStarsCounter.get(2) + 1) "4" -> listofStarsCounter.set(3, listofStarsCounter.get(3) + 1) "5" -> listofStarsCounter.set(4, listofStarsCounter.get(4) + 1) } count++ sumAllvalue += entary.value.toString().toInt() } } } try { text.text = "%.1f".format(sumAllvalue.toDouble() / count.toDouble()) star1.text = "%.1f".format((100.0/count.toDouble()) * listofStarsCounter.get(0).toDouble()) star2.text = "%.1f".format((100.0 / count.toDouble()) * listofStarsCounter.get(1).toDouble()) star3.text = "%.1f".format((100.0 / count.toDouble()) * listofStarsCounter.get(2).toDouble()) star4.text = "%.1f".format((100.0 / count.toDouble()) * listofStarsCounter.get(3).toDouble()) star5.text = "%.1f".format((100.0 / count.toDouble()) * listofStarsCounter.get(4).toDouble()) } catch (e : ArithmeticException) { } } }) } 

}

使用你的例子,你的ArrayList最初看起来像这样:

 [ 1 , 1 , 0 , 0, 0 ] 

当您为1星评级添加1时,您在侦听器中获得的快照实际上包含整个更新列表,这将是:

 [ 2 , 1 , 0 , 0, 0 ] 

你得到意想不到的结果的原因是因为你基本上是把这个更新的列表添加到你的原来的,这当然会导致:

 [ 3 , 2 , 0 , 0 , 0 ] 

重新启动应用程序会修复此问题,因为您再次从全零列表开始,并将侦听器中收到的数据添加到该列表中。


因此,要解决您的问题,只需要在获取更新时覆盖列表中的每个值,而不是添加到现有值。 您可以在运行循环之前将列表重置为全零。

 val objectMap : MutableMap objectMap = child.value as MutableMap listofStarsCounter = arrayListOf(0, 0, 0, 0, 0) for (entary in objectMap) { ... }