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

Fragment返回后AutocompleteTextView仅显示1项问题求助

问题解决:Fragment恢复后AutocompleteTextView仅显示单个选项

问题背景

在Fragment中使用AutocompleteTextView与ArrayAdapter,Adapter数据来自字符串资源。首次加载Fragment时一切正常,但从返回栈回到该Fragment或恢复已保存的Fragment后,AutocompleteTextView仅显示1个选项,而ArrayAdapter实际包含6条数据。尝试将Adapter存入ViewModel后问题仍未解决。

问题原因

当Fragment恢复时,你先给AutocompleteTextView设置了默认文本,再绑定Adapter。此时AutocompleteTextView会自动触发文本过滤逻辑,只保留与当前输入文本完全匹配的选项,导致其他条目被隐藏。虽然Adapter的count显示为6,但过滤后的结果只有匹配默认文本的那一条。

解决方案

调整操作顺序:先为AutocompleteTextView设置Adapter,再设置默认文本,同时设置文本时关闭自动过滤触发。另外注意ViewModel的正确初始化方式,避免Fragment重建时丢失状态。

修改后的代码

SomeFragment.kt

class SomeFragment : Fragment() {
    // 用viewModels()获取与Fragment生命周期绑定的ViewModel实例
    private val mSomeViewModel by viewModels<SomeViewModel>()

    private lateinit var mSomeAutoCompleteTextView: AutoCompleteTextView
    private lateinit var mSomeStrings: Array<String>
    private lateinit var mSomeArrayAdapter: ArrayAdapter<String>

    override fun onCreateView(
        inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?,
    ): View? {
        mSomeStrings = resources.getStringArray(R.array.strings_array)
        mSomeArrayAdapter = ArrayAdapter(requireContext(), R.layout.dropdown_item, mSomeStrings)

        return inflater.inflate(R.layout.fragment_order_server, container, false)
    }

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        mSomeAutoCompleteTextView = view.findViewById(R.id.someAutoCompleteTextView)

        mSomeAutoCompleteTextView.apply {
            // 第一步:设置Adapter
            setAdapter(mSomeArrayAdapter)
            // 第二步:设置默认文本,第二个参数传false,避免触发自动过滤
            setText(mSomeStrings[mSomeViewModel.positionId], false)
            setOnItemClickListener { _, _, position, _ ->
                mSomeViewModel.someFunction(position)
            }
        }
    }
}

SomeViewModel.kt(补充默认值优化)

class SomeViewModel : ViewModel() {
    private var mPositionId = 0 // 初始化默认位置,避免空值异常

    val positionId: Int
        get() = mPositionId

    fun someFunction(position: Int) {
        mPositionId = position

        // 其他业务代码
    }
}

额外说明

  • setText(text, false)中的第二个参数设为false,会禁止触发文本改变的监听器,也不会自动展开下拉菜单或执行过滤,确保所有选项都能正常显示。
  • 使用by viewModels<SomeViewModel>()替代直接实例化ViewModel,保证Fragment重建时ViewModel的状态得以保留,避免positionId重置。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 03:10:19