You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AutoCompleteTextView配置变更后下拉菜单仅显示一项的问题排查与解决

AutoCompleteTextView配置变更后下拉菜单仅显示一项的问题分析与修复

配置AutoCompleteTextView的代码如下:

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    binding.viewModel = viewModel
    
    initSortingAutoCompleteTextView()
}

private fun initSortingAutoCompleteTextView() {
    val adapterSorting = ArrayAdapter(
        activityContext,
        android.R.layout.simple_spinner_dropdown_item,
        sortingValues.map { it.title }
    )
    with(binding.sortingSelectAutocompleteText) {
        setAdapter(adapterSorting )
    }
}

初始状态下组件功能正常,下拉菜单可显示全部选项;但在配置变更(如横竖屏切换)后,下拉菜单仅显示一项。


问题原因

核心问题在于数据源sortingValues在配置变更后丢失了大部分数据,仅保留了一项:
当横竖屏切换等配置变更发生时,Fragment会被系统销毁并重新创建。如果sortingValues是Fragment的局部成员变量,且未通过持久化方式(如ViewModel、onSaveInstanceState)保存,重建后的Fragment会重新初始化sortingValues,导致数据残缺;若sortingValues从临时存储(如未做状态保存的Activity)获取,配置变更后相关数据未被正确传递,也会出现同样问题。


修复方案

方案1:将数据源移至ViewModel(推荐)

ViewModel在配置变更时不会被销毁,可持久化保存数据,彻底解决数据丢失问题:

  1. 在ViewModel中定义并初始化数据源:
// 你的ViewModel类
class YourViewModel : ViewModel() {
    // 假设YourSortingModel是你的排序数据模型类
    val sortingValues = MutableLiveData<List<YourSortingModel>>()

    init {
        // 加载完整的排序选项数据,可从本地资源、数据库或网络获取
        sortingValues.value = listOf(
            YourSortingModel("最新优先"),
            YourSortingModel("热度优先"),
            YourSortingModel("价格从低到高"),
            // ... 其他选项
        )
    }
}
  1. 在Fragment中从ViewModel获取数据并设置适配器:
private fun initSortingAutoCompleteTextView() {
    viewModel.sortingValues.observe(viewLifecycleOwner) { values ->
        val adapterSorting = ArrayAdapter(
            requireContext(),
            android.R.layout.simple_spinner_dropdown_item,
            values.map { it.title }
        )
        binding.sortingSelectAutocompleteText.setAdapter(adapterSorting)
    }
}

方案2:通过onSaveInstanceState保存并恢复数据

若不想使用ViewModel,可通过Fragment的状态保存机制恢复数据:

  1. 保存数据到Bundle:
override fun onSaveInstanceState(outState: Bundle) {
    super.onSaveInstanceState(outState)
    // 注意:YourSortingModel需要实现Parcelable接口
    outState.putParcelableArrayList("sorting_values", ArrayList(sortingValues))
}
  1. 在Fragment重建时恢复数据:
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    binding.viewModel = viewModel
    
    // 恢复数据,若未恢复到则加载默认数据
    sortingValues = savedInstanceState?.getParcelableArrayList<YourSortingModel>("sorting_values") 
        ?: loadDefaultSortingValues()
    
    initSortingAutoCompleteTextView()
}

// 加载默认排序选项的方法
private fun loadDefaultSortingValues(): List<YourSortingModel> {
    return listOf(
        YourSortingModel("最新优先"),
        YourSortingModel("热度优先"),
        // ... 其他选项
    )
}

额外优化点

  • 适配器上下文改用requireContext(),替代activityContext,确保上下文与Fragment生命周期绑定,减少内存泄漏或上下文失效风险。

内容的提问来源于stack exchange,提问作者user924

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.15 08:50:36