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
相关产品推荐
相关产品推荐

