Как удалить все элементы из ArrayList в kotlin - PullRequest
0 голосов
/ 28 сентября 2019

У меня есть список массивов в kotlin, и я хочу удалить из него весь элемент, оставить его как пустой массив, чтобы начать добавлять новые динамические данные.я попробовал ArrayList.remove(index) arrayList.drop(index) но ничего не работает,

Декларация:

var fromAutoCompleteArray: List<String> = ArrayList()

вот как я это пробую:

for (item in fromAutoCompleteArray){
        fromAutoCompleteArray.remove(0)
             }

Я используюaddTextChangedListener для удаления старых данных и добавления новых данных на основе ввода пользователя:

    private fun settingToAutoComplete() {
        val toAutoCompleteTextView: AutoCompleteTextView =
            findViewById<AutoCompleteTextView>(R.id.toAutoCompleteText)
        toAutoCompleteTextView.addTextChangedListener(object : TextWatcher {
            override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
            }

            override fun afterTextChanged(s: Editable?) {
                doLocationSearch(toAutoCompleteTextView.text.toString(), 2)

            }

            override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
                toAutoCompleteTextView.postDelayed({
                    toAutoCompleteTextView.showDropDown()
                }, 10)
            }

        })
        val adapter = ArrayAdapter(this, android.R.layout.select_dialog_item, toAutoCompleteArray)
        toAutoCompleteTextView.setAdapter(adapter)
        toAutoCompleteTextView.postDelayed({
            toAutoCompleteTextView.setText("")
            toAutoCompleteTextView.showDropDown()
        }, 10)
    }

А вот функция, которая добавляет данные:

    private fun doLocationSearch(keyword: String, fromTo: Number) {
        val baseURL = "api.tomtom.com"
        val versionNumber = 2
        val apiKey = "******************"
        val url =
            "https://$baseURL/search/$versionNumber/search/$keyword.json?key=$apiKey"
        val client = OkHttpClient()
        val request = Request.Builder().url(url).build()
        client.newCall(request).enqueue(object : Callback {
            override fun onResponse(call: Call, response: okhttp3.Response) {
                val body = response.body?.string()
                println("new response is : $body")
                val gson = GsonBuilder().create()
                val theFeed = gson.fromJson(body, TheFeed::class.java)
                if (theFeed.results != null) {
                    for (item in theFeed.results) {
                        println("result address ${item.address.freeformAddress} ")
                        if (fromTo == 1) {
                            fromAutoCompleteArray = fromAutoCompleteArray + item.address.freeformAddress
                            println(fromAutoCompleteArray.size)
                        } else {
                            toAutoCompleteArray = toAutoCompleteArray + item.address.freeformAddress
                        }
                    }
                } else {
                    println("No Locations found")
                }


            }

            override fun onFailure(call: Call, e: IOException) {
                println("Failed to get the data!!")
            }
        })

    }

и, как вы видите,строка println(fromAutoCompleteArray.size) показывает мне, удалена она или нет, и она всегда увеличивается.

Также попытался использовать clear() без цикла, и ни одна не работает:

fromAutoCompleteArray.clear()

Ответы [ 2 ]

3 голосов
/ 28 сентября 2019

Тип List в Котлине не является изменяемым.Если вы хотите, чтобы ваш список изменился, вам нужно объявить его как MutableList.

Я бы предложил изменить эту строку:

var fromAutoCompleteArray: List<String> = ArrayList()

На это:

val fromAutoCompleteArray: MutableList<String> = mutableListOf()

И тогда вы сможете вызвать любой из них:

fromAutoCompleteArray.clear()     // <--- Removes all elements
fromAutoCompleteArray.removeAt(0) // <--- Removes the first element

Я также рекомендую mutableListOf() над созданием экземпляра ArrayList самостоятельно.У Kotlin есть разумные значения по умолчанию, и его немного легче читать.В конце концов, в большинстве случаев он будет делать то же самое в любом случае.

Также предпочтительно использовать val вместо var, когда это возможно.

Обновление : Vals не vars, спасибо, что заметили, что Алексей

0 голосов
/ 28 сентября 2019

Я не знаю, как вы объявляете arraylist, но это можно сделать следующим образом:

var arrayone: ArrayList<String> = arrayListOf("one","two","three")

val arraytwo = arrayone.drop(2)

for (item in arraytwo) {
  println(item) // now prints all except the first one...
}

в вашем случае попробуйте это

val arraytwo = fromAutoCompleteArray.toMutableList().apply { 
  removeAt(0)
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...