如何在 Kotlin 中向列表添加一个项目?

102
我正在尝试将元素列表添加到字符串列表中,但我发现Kotlin没有像Java那样的add函数,因此请帮助我如何将项目添加到列表中。
class RetrofitKotlin : AppCompatActivity() {

    var listofVechile:List<Message>?=null
    var listofVechileName:List<String>?=null
    var listview:ListView?=null
    var progressBar:ProgressBar?=null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_retrofit_kotlin)

        listview=findViewById<ListView>(R.id.mlist)
        var apiInterfacee=ApiClass.client.create(ApiInterfacee::class.java)
        val call=apiInterfacee.getTaxiType()
        call.enqueue(object : Callback<TaxiTypeResponse> {

            override fun onResponse(call: Call<TaxiTypeResponse>, response: Response<TaxiTypeResponse>) {

                listofVechile=response.body()?.message!!
                println("Sixze is here listofVechile   ${listofVechile!!.size}")
                if (listofVechile!=null) {
                    for (i in 0..listofVechile!!.size-1) {

                        //how to add the name only listofVechileName list

                    }
                }
                //println("Sixze is here ${listofVechileName!!.size}")
                val arrayadapter=ArrayAdapter<String>(this@RetrofitKotlin,android.R.layout.simple_expandable_list_item_1,listofVechileName)
                listview!!.adapter=arrayadapter

            }
            override fun onFailure(call: Call<TaxiTypeResponse>, t: Throwable) {

            }
        })
    }
}

哎?你在说哪个列表?Kotlin列表不就是Java列表吗?如果外国名字让我困惑了,那我很抱歉。 - CryptoFool
@Steve 我在谈论 var listofVechileName:List<String>?=null 如何往里面添加项目。 - Mohit Lakhanpal
2
你需要退一步,阅读文档以学习 Kotlin 的基础知识,只需阅读文档:https://kotlinlang.org/docs/reference/collections.html - JB Nizet
啊,是的……不可变的东西。我只是没有将这两个联系在一起。这很明显,很合理。我还没有做足够的 Kotlin 编码。这不是关于阅读文档。相反,它是关于在 Java 中完成日常工作,并不得不将注意力从那里转移到 Kotlin 上思考。 - CryptoFool
1
一个简单的答案是,你不能直接将项目添加到List中而不将其转换为可变形式。 - iCantC
8个回答

74

更符合惯用语的方法是使用MutableList而不是具体的ArrayList。你可以这样声明:

val listOfVehicleNames: MutableList<String> = mutableListOf()

并以这种方式添加。或者,你可能希望更喜欢不可变性,并将其声明为:

var listOfVehicleNames: List<String> = emptyList()

在您的完成块中,只需重新分配它:

listOfVehicleNames = response.body()?.message()?.orEmpty()
    .map { it.name() /* assumes name() function exists */ }

34
哦,是的,这很明显!比Java容易多了。我很高兴我们换了过来。 - SMBiggs
@SMBiggs,你是在讽刺吗? - The incredible Jan
1
@TheincredibleJan 是的。引用TJ Miller的话,“讽刺的问题在于它很容易被误解。” - SMBiggs

73

谈论惯用方法...

当你可以仅使用不可变列表(通常在Kotlin中),只需使用+plus。它返回一个新列表,其中包含原始列表的所有元素和新添加的元素:

val original = listOf("orange", "apple")
val modified = original + "lemon" // [orange, apple, lemon]

original.plus("lemon")产生的结果与original + "lemon"相同。虽然略微冗长,但在组合多个集合操作时可能会派上用场。

return getFruit()
       .plus("lemon")
       .distinct()
除了可以添加单个元素,你还可以使用plus将整个集合连接起来:
val original = listOf("orange", "apple")
val other = listOf("banana", "strawberry")
val newList = original + other // [orange, apple, banana, strawberry]

声明:这并不能直接回答楼主的问题,但我认为在一个标题为“如何在Kotlin中向列表添加项?”的问题中,该问题是此主题的谷歌热门搜索之一,plus必须被提及。


.plus() 的一个限制是它必须是 MutableList。普通的 List 没有实现该方法。 - Jay Whitsitt
1
@JayWhitsitt 这是不正确的。请尝试运行我回答中的代码示例。例如,listOf 返回一个只读列表,但您绝对可以在其上调用 plus()。正如我上面提到的,plus 返回一个新列表;它从不修改原始列表。 - Jonik

53

如果你不想或者无法直接使用数组列表,可以使用以下代码添加项目

itemsList.toMutableList().add(item)

itemlist:您的物品清单列表

item:您想要添加的物品


2
你没有漏掉一个作业吧?toMutableList() 创建了 itemsList 的副本并且不会改变它,对吧? - The incredible Jan
2
我认为你是正确的,缺少一个赋值语句,而且 .add(item) 返回一个布尔值,所以这需要分步骤完成,如果我没有弄错的话。 - jure
1
@PhilipRego 不要在初始化中使用它。应该像这样使用 => aggList.toMutableList().add(user), 在初始化中 => var aggList: List<User> = emptyList<User> - Radesh
2
它不会改变itemsList的任何内容。 - c-an

11

不要使用不可变的常规列表,而是使用可变的arrayListof。

这样您的常规列表将变为

var listofVehicleNames = arrayListOf("list items here")

那么您可以使用添加函数

listOfVehicleNames.add("what you want to add")

8

JB Nizet所说的是正确的,但如果我的答案解决了您的问题,请将其标记为正确。 - Peppe Scab
我不想改太多原作者的代码,但有人提醒我应该避免将初始化值设为 null,最好使用 lazy initialization。 - Peppe Scab

4

对于任何特定的类,以下可能有所帮助

 var newSearchData = List<FIRListValuesFromServer>()

        for (i in 0 until this.singleton.firListFromServer.size) {

            if (searchText.equals(this.singleton.firListFromServer.get(i).FIR_SRNO)) {

                newSearchData.toMutableList().add(this.singleton.firListFromServer.get(i))

            }
        }

2

0
var list = listOf("a")
list += "b"

感谢您对Stack Overflow社区做出贡献的兴趣。这个问题已经有很多答案了,其中一个答案已经得到社区的广泛验证。您确定您的方法之前没有被提到过吗?如果是这样的话,能否解释一下您的方法与之前的方法有何不同,以及在什么情况下您的方法可能更好,并且为什么您认为之前的答案不够满意。您能否编辑您的答案并提供解释? - undefined
@JeremyCaney 这里没有其他答案使用+=(除了一个已删除的)。其他答案使用foo = foo + item,但没有使用+= - undefined
@starball:贡献者应该解释为什么这种方法比现有方法更可取。这样回答会更有用,尤其是对于对语法不熟悉的读者来说。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接