Cambiar un valor en la lista mutable en Kotlin

2 minutos de lectura

Avatar de usuario de Eduard Unruh
Eduardo Unruh

Tengo esta lista mutable:

[Videos(id=4, yt_id=yRPUkDjwr1A, title=test4, likes=0, kat=pranks, ilike=false), Videos(id=3, yt_id=WkyUU9ZDUto, title=test3, likes=0, kat=pranks, ilike=false), Videos(id=2, yt_id=B_X9OQqtduE, title=test2, likes=0, kat=animals, ilike=false), Videos(id=1, yt_id=ywaKlGNiv80, title=test1, likes=0, kat=animals, ilike=false)]

como puedo cambiar ilike a true dónde id es 2

Esto es lo que he intentado:

for (i in 0 until vids!!.size) {
    Log.d("lets", vids!!.get(i).title)
        
    if(vids!!.get(i).id == 2){
        vids!!.get(i).ilike = true
    }
}

  • que error te da

    – njzk2

    23 de octubre de 2019 a las 6:18

Avatar de usuario de Sergio
sergi

Puedes usar find función para encontrar el elemento con id = 2 y cambiar su propiedad:

vids?.find { it.id == 2 }?.iLike = true

Nota: es una buena práctica usar signo de interrogación si la propiedad es anulable y no estás seguro de si es nulo o no.

  • Lo mismo aquí que en otra respuesta, obtengo “Val no se puede reasignar”:/

    –Eduard Unruh

    21 de febrero de 2019 a las 13:49

  • Parece iLike propiedad marcada como val. tienes que hacerlo var en tu modelo: Video(..., var iLike, ...)

    – sergio

    21 de febrero de 2019 a las 13:55


  • Tiene razón: necesito cambiarlo en la clase donde se definen todos los valores de Videos, ¡gracias!

    –Eduard Unruh

    21 de febrero de 2019 a las 13:58


avatar de usuario de forpas
forpas

Si espera que algunos elementos (¿quizás 1 o 2?) se vean afectados,
puede filter la lista y luego cambiar iLike de los elementos filtrados:

vids!!.filter { it.id == 2 }.forEach { it.iLike = true }

Avatar de usuario de Rafa
rafa

Prueba esto, asumo que tu Videos estructura es una clase de datos definida algo así. data class Videos(val id: Int, val yt_id: String, val title: String, val likes: Int, val kat: String, val ilike: Boolean)

list.forEachIndexed { index, video ->
    video.takeIf { it.id == 2}?.let {
        list[index] = it.copy(ilike = true)
    }
}

  • Recibo el error “No se puede reasignar el valor” en video.takeIf { it.id == 2 }?.ilike

    –Eduard Unruh

    21 de febrero de 2019 a las 13:48

  • Entonces mi suposición no es cierta entonces. No puede cambiar los valores en el Videos tipo. Tienes que reemplazar completamente el tipo. Estoy actualizando el ejemplo anterior.

    – Rafael

    21 de febrero de 2019 a las 14:15

  • Sí, sry Sergey fue más rápido.

    –Eduard Unruh

    21 de febrero de 2019 a las 16:40

Tuve que cambiar varias propiedades y necesitaba retener el objeto modificado. Por lo tanto, el siguiente enfoque funcionó mejor para mí:

//First, find the position of the video in the list
val videoPosition= list.indexOfFirst {
   it.id == 2
}

//Now get your video by position and make changes
val updatedVideo = list[videoPosition].apply {
   //Make all changes you need here
   ilike = true

   //...
}

//Finally, replace updated video into your list. 
list[videoPosition] = updatedVideo 

Usar set para reemplazar el objeto si no desea utilizar predicates o iteration

P.ej.

val video = (...,read = true) //or however you are getting the current model
val updatedVideo = video
updatedVideo.read = true
vids[vids.indexOf(video)] = updatedVideo

¿Ha sido útil esta solución?