Ändern Sie einen Wert in der veränderlichen Liste in Kotlin

Lesezeit: 2 Minuten

Benutzeravatar von Eduard Unruh
Eduard Unruh

Ich habe diese veränderbare Liste:

[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)]

Wie kann ich mich ändern ilike Zu true Wo id Ist 2

Folgendes habe ich versucht:

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
    }
}

  • Welchen Fehler bekommst du?

    – njzk2

    23. Oktober 2019 um 6:18 Uhr

Sergios Benutzeravatar
Sergio

Sie können verwenden find Funktion, um das Element mit der ID = 2 zu finden und seine Eigenschaft zu ändern:

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

Hinweis: Dies ist eine bewährte Vorgehensweise Fragezeichen, wenn die Eigenschaft NULL-Werte zulässt und Sie sind sich nicht sicher, ob es null ist oder nicht.

  • Wie bei anderen Antworten erhalte ich auch hier die Meldung „Val kann nicht neu zugewiesen werden“ :/

    – Eduard Unruh

    21. Februar 2019 um 13:49 Uhr

  • Es scheint iLike Eigenschaft markiert als val. Du musst es schaffen var in deinem Modell: Video(..., var iLike, ...)

    – Sergio

    21. Februar 2019 um 13:55 Uhr


  • Sie haben Recht: Ich muss es in der Klasse ändern, in der alle Werte von Videos definiert sind, danke!

    – Eduard Unruh

    21. Februar 2019 um 13:58


Benutzeravatar von forpas
forpas

Wenn Sie davon ausgehen, dass nur wenige Artikel (vielleicht 1 oder 2?) betroffen sein werden,
du kannst filter die Liste und ändern Sie sie dann iLike der gefilterten Artikel:

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

Rafas Benutzeravatar
Rafa

Probieren Sie es aus, ich gehe von Ihrem aus Videos Struktur ist eine Datenklasse, die ungefähr so ​​definiert ist. 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)
    }
}

  • Ich erhalte die Fehlermeldung „Wert kann nicht neu zugewiesen werden“ auf video.takeIf { it.id == 2 }?.ilike

    – Eduard Unruh

    21. Februar 2019 um 13:48

  • Meine Annahme trifft also nicht zu. Sie können die Werte im nicht ändern Videos Typ. Sie müssen den Typ komplett austauschen. Ich aktualisiere das obige Beispiel

    – Rafa

    21. Februar 2019 um 14:15 Uhr

  • Ja, tut mir leid, Sergey war schneller

    – Eduard Unruh

    21. Februar 2019 um 16:40 Uhr

Ich musste mehrere Eigenschaften ändern und musste das geänderte Objekt behalten. Daher hat folgender Ansatz für mich besser funktioniert:

//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 

Verwenden set um das Objekt zu ersetzen, wenn Sie es nicht verwenden möchten predicates oder iteration

Z.B.

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

1452100cookie-checkÄndern Sie einen Wert in der veränderlichen Liste in Kotlin

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy