向微调适配器添加新元素

时间:2018-07-01 17:44:03

标签: android kotlin spinner android-arrayadapter http-get

我是Kotlin语言的新手,我将从网站上加载Spinner数据。因此,我使用Fuel Library作为我的httpGethttpPost和...帮助程序库,而仅使用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()的执行没有任何错误,但结果是没有,并且没有向{添加任何条目{1}}。 在此先感谢:)

1 个答案:

答案 0 :(得分:0)

plusElement上调用List不会将元素添加到现有列表中(请记住,Kotlin中的List是不可变的)。相反,它将创建一个添加了新项目的新列表。原始列表(适配器使用的列表)保持不变。此外,除了添加列表之外,您应该做的是直接将新项目添加到适配器。这样,适配器将自动更新,而无需调用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)