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) { ... } 
  • ¿Los types de datos de Kotlin están basados ​​en types de datos Java primitivos o no primitivos?
  • ¿Deben las properties de la class en Kotlin ser privadas y cómo acceder a ellas?
  • TornadoFx: que realiza mejor FXML o type-CSS
  • ejecutar el proyecto android studio 2.3.3 kotlin en android studio 3.0.1 después de la actualización
  • kotlin android - Xposed IllegalArgumentException 'android.content.res.CoollifeUITpedArray'
  • Okhttp3 solicita que se devuelva la respuesta vacía, así como diferentes encabezados que el cartero
  • ¿Cuál es el nombre correcto para la documentation en línea de Kotlin?
  • Map.mapTo a otro map
  • Descargar el file y savelo para download la carpeta usando kotlin en Android
  • Daga 2: inputs múltiples con la misma key
  • Mockito never () no funciona con andThen rxjava2