【问题标题】:Change a value in mutable list in Kotlin在 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
            }
        }

【问题讨论】:

  • 你得到什么错误?

标签: android arrays list loops kotlin


【解决方案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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-06-13
        • 2022-01-18
        • 1970-01-01
        • 2016-08-16
        • 1970-01-01
        • 2019-04-24
        • 1970-01-01
        相关资源
        最近更新 更多