Mapa en Firebase onDataChange en Kotlin

Mi código count estrellas (5 estrellas) en firebase y tengo un problema, si se actualiza en time real, no count correctamente

(Firebase ahora)

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

Y después de cambiar firebase [agregar 1. + = 1]

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

Pero si reinicio la aplicación, cambia al resultado normal:

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

¿Por qué MutableMap agrega el map por segunda vez con una nueva estrella?

class FireBaseRealTime { var listofStarsCounter : ArrayList<Int> = ArrayList<Int>(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<String, Any> objectMap = child.value as MutableMap<String, Any> 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) { } } }) } 

}

Usando su ejemplo, su ArrayList inicialmente se ve así:

 [ 1 , 1 , 0 , 0, 0 ] 

Cuando agrega 1 a las clasificaciones de 1 estrella, la instantánea que obtiene en el oyente en realidad contiene toda la list actualizada, que sería:

 [ 2 , 1 , 0 , 0, 0 ] 

El motivo por el que recibe el resultado inesperado es porque esencialmente está agregando esta list actualizada a su original, lo que, por supuesto, da como resultado:

 [ 3 , 2 , 0 , 0 , 0 ] 

Al reiniciar la aplicación se soluciona esto, ya que se comienza de nuevo con una list de cero y se agregan los datos recibidos en el oyente.


Entonces, para solucionar su problema, solo necesita sobrescribir cada valor en su list cuando obtiene una actualización en lugar de agregar el valor existente. Puede hacer esto restableciendo su list a todos los ceros antes de ejecutar su ciclo.

 val objectMap : MutableMap<String, Any> objectMap = child.value as MutableMap<String, Any> listofStarsCounter = arrayListOf(0, 0, 0, 0, 0) for (entary in objectMap) { ... } 
  • Kotlin delegando a un futuro
  • Rasgos de Kotlin y retroadaptación
  • Prueba de unidad Kotlin para parámetro de function y object
  • ¿Cómo puedo establecer una propiedad de un object complementario en Kotlin a través de la reflexión?
  • ¿Cómo recuperar datos de una database de Firebase y almacenarlos en un ListArray <Class>? - Kotlin
  • ¿Se puede usar Flink con Kotlin?
  • Kotliquery no cierra las conexiones postgresql
  • C ++ Enum equivalente en Kotlin
  • ¿Por qué Kotlin soltó la palabra key "nueva"?
  • El evento táctil de visitas llena toda la pantalla
  • Kotlin JPA encapsula OneToMany