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

AutoCompleteTextView选择项异常:选中项显示为第一项问题求助

解决AutoCompleteTextView选中项后显示第一项的问题

嘿,我碰到过这个坑!你遇到的现象是AutoCompleteTextView的默认行为搞的鬼——当你调用普通的setText()方法时,它会自动触发内部的过滤逻辑,把你设置的文本当成用户输入去匹配适配器里的列表项,刚好匹配到第一项,就自动替换成第一项显示了。

给你两种靠谱的解决办法:

方法一:使用带过滤开关的setText方法(推荐)

AutoCompleteTextView本身提供了一个重载的setText(CharSequence text, boolean filter)方法,第二个参数传false就能跳过过滤逻辑,直接设置选中的文本:

district.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
        selectedDistrict = districtsNameList.get(position);
        Log.d("tag","============position===="+position);
        Log.d("tag", "22222222222222222222222222===" + selectedDistrict);
        
        // 关键:用带filter参数的setText,false表示不触发过滤
        district.setText(selectedDistrict, false);
        // 把光标移到文本末尾,提升用户体验
        district.setSelection(selectedDistrict.length());
    }
});

方法二:临时移除适配器再恢复

如果你的项目兼容旧版本(不过现在基本都支持上面的方法了),可以先移除适配器,设置文本后再重新绑定:

district.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
        selectedDistrict = districtsNameList.get(position);
        Log.d("tag","============position===="+position);
        Log.d("tag", "22222222222222222222222222===" + selectedDistrict);
        
        // 先移除适配器,避免setText触发过滤
        district.setAdapter(null);
        district.setText(selectedDistrict);
        // 重新绑定适配器,恢复自动提示功能
        Utilities.setAutoCompleteTextViewAdapter(MainActivity.this, districtsNameList, district);
        district.setSelection(selectedDistrict.length());
    }
});

另外提个小细节:你代码里的Log.d("tag","============positioj===="+position)有个拼写错误,positioj改成position就更规范啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 03:23:56