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
}
}
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 comoval
. tienes que hacerlovar
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
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 }
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
que error te da
– njzk2
23 de octubre de 2019 a las 6:18