Добавление нового элемента (ов) в адаптер Spinner - PullRequest
0 голосов
/ 01 июля 2018

Я новичок в Kotlin языке и собираюсь загрузить Spinner данные с веб-сайта. По этой причине я использовал Fuel Library в качестве вспомогательной библиотеки httpGet, httpPost и ... и просто элемент управления Spinner для отображения этих данных пользователю. Ниже мой проверенный код:

var listOfLesson:List<String> = listOf()
override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.ostad_page)

    val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, listOfLesson)
    "home/GetAllLessons".httpGet().responseString { request, response, result ->
        when (result) {
            is Result.Success -> {
                val lessonsArray: List<tblLesson> =
                        Gson().fromJson(result.value, Array<tblLesson>::class.java).toList()
                var index:Int = 0
                for (lesson: tblLesson in lessonsArray) {
                    listOfLesson.plusElement(lesson.Title)
                }
                showSuccess("لیست دروس بارگذاری شد")
                adapter.notifyDataSetChanged()
            }
        }
    }
    adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
    lessons.setAdapter(adapter)
    adapter.notifyDataSetChanged()
}

Как я проследил часть Result.Success, все было в порядке, и данные были успешно загружены с URL в listOfLesson, и adapter.notifyDataSetChanged() был выполнен без ошибок, но в результате ничего не получилось, и запись в Spinner не была добавлена. Заранее спасибо:)

1 Ответ

0 голосов
/ 01 июля 2018

Вызов plusElement для List не добавляет элемент в существующий список (помните, List в Kotlin является неизменным). Скорее, он создает новый список с добавленным новым элементом. Исходный список (тот, который использует адаптер) остается без изменений. Более того, вместо того, чтобы добавлять в список, вам нужно добавить новые элементы непосредственно в адаптер. Таким образом, адаптер обновится без необходимости вызова notifyDataSetChanged().

val adapter = ArrayAdapter(this, android.R.layout.simple_spinner_item, ArrayList<String>())
"home/GetAllLessons".httpGet().responseString { request, response, result ->
    when (result) {
        is Result.Success -> {
            Gson().fromJson(result.value, Array<tblLesson>::class.java)
                .map { it.Title }
                .let { adapter.addAll(it) }
            showSuccess("لیست دروس بارگذاری شد")
        }
    }
}
adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item)
lessons.setAdapter(adapter)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...