在 Kotlin 中更改可变列表中的值

Posted

技术标签:

【中文标题】在 Kotlin 中更改可变列表中的值【英文标题】:Change a value in mutable list in Kotlin 【发布时间】:2019-07-14 19:06:44 【问题描述】:

我得到了这个可变列表:

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

如何将ilike 更改为true,其中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
            
        

【问题讨论】:

你得到什么错误? 【参考方案1】:

您可以使用find 函数查找id = 2 的元素并更改其属性:

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

注意:最好使用question mark if the property is nullable,但您不确定它是否为空。

【讨论】:

此处与其他答案相同,我得到“无法重新分配 Val”:/ 似乎iLike 属性标记为val。你需要在你的模型中设置varVideo(..., var iLike, ...) 你是对的 :D 我需要在定义了所有视频值的类中更改它,谢谢!【参考方案2】:

如果您预计少数项目(可能是 1 个或 2 个?)会受到影响, 您可以filter 列表然后更改过滤项目的iLike

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

【讨论】:

【参考方案3】:

试试这个,我假设你的 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)
    

【讨论】:

我在 video.takeIf it.id == 2 ?.ilike 上收到错误“无法重新分配 Val” 所以我的假设不成立。您不能更改 Videos 类型中的值。您必须完全替换类型。我正在更新上面的示例 是的,谢尔盖更快【参考方案4】:

我必须更改几个属性,并且需要保存更改后的对象。因此,以下方法对我来说效果更好:

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

【讨论】:

【参考方案5】:

如果您不想使用predicatesiteration,请使用set 替换对象

例如。

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

【讨论】:

以上是关于在 Kotlin 中更改可变列表中的值的主要内容,如果未能解决你的问题,请参考以下文章

无法将元素添加到 kotlin 中可变列表的数组数组

Kotlin——数组

在 kotlin 中更改参数内部变量的值

Kotlin集合操作 ② ( MutableList 可变列表集合 | 修改 MutableList 集合的 mutator 函数 )

Kotlin集合操作 ② ( MutableList 可变列表集合 | 修改 MutableList 集合的 mutator 函数 )

Kotlin集合操作 ② ( MutableList 可变列表集合 | 修改 MutableList 集合的 mutator 函数 )