web-dev-qa-db-ja.com

Kotlinの変更可能なリストの値を変更する

私はこの可変リストを手に入れました:

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

iliketrueに変更するにはどうすればよいですか。ここでid2

これは私が試したものです:

        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
            }
        }
11
Eduard Unruh

find関数を使用して、id = 2の要素を検索し、そのプロパティを変更できます。

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

注: プロパティがnull可能である場合は疑問符 を使用することをお勧めします。nullかどうかは不明です。

16
Sergey

影響を受けるアイテムが少ないと思われる場合(多分1または2?)、
リストをfilterしてから、フィルタリングされたアイテムのiLikeを変更できます。

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

これを試してください。あなたのVideos構造は、そのように定義されたデータクラスであると想定しています。 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)
    }
}
2
Rafa

setまたはpredicatesを使用しない場合は、iterationを使用してオブジェクトを置き換えます

例えば。

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

いくつかのプロパティを変更する必要があり、変更したオブジェクトを保持する必要がありました。したがって、次のアプローチは私にとってよりうまくいきました:

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