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

Android基于SQLite的AutoCompleteTextView无提示问题求助

解决AutoCompleteTextView无提示的问题

我帮你排查出几个关键问题,按顺序修复就能解决:

1. 数组适配器未绑定数据源

你创建ArrayAdapter的时候,漏掉了数据源参数——适配器里没有任何数据,自然不会显示提示。修改这行代码:

// 原代码(无数据源)
ArrayAdapter<String> myadap = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1);

// 修改后(传入查询到的questions列表)
ArrayAdapter<String> myadap = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, questions);

2. 优化ModelHelper的查询方法

你的getQuestionForSearch方法有几个可以优化的地方,避免潜在问题:

  • 给ArrayList指定泛型ArrayList<String>,避免类型不安全的转换
  • 关闭Cursor和数据库连接,防止资源泄漏
  • 如果需要实现实时模糊搜索,要把搜索关键词作为参数传入方法(你之前注释的LIKE语句是对的,现在的代码是查询所有数据,后续可以改成带参数的版本)

修改后的基础查询方法:

public ArrayList<String> getQuestionForSearch() {
    ArrayList<String> lst = new ArrayList<>();
    SQLiteDatabase db = this.getReadableDatabase();
    Cursor c = db.rawQuery(" SELECT " + KEY_QUESTION + " from " + TABLE_QUESTION, null);
    
    if (c != null && c.moveToFirst()) {
        do {
            String t1 = c.getString(c.getColumnIndexOrThrow(KEY_QUESTION));
            lst.add(t1);
        } while (c.moveToNext());
        c.close(); // 关闭Cursor
    }
    db.close(); // 关闭数据库连接
    return lst;
}

如果要实现输入时实时模糊匹配,可以改成带参数的版本(还能避免SQL注入):

public ArrayList<String> getQuestionForSearch(String searchKeyword) {
    ArrayList<String> lst = new ArrayList<>();
    SQLiteDatabase db = this.getReadableDatabase();
    // 使用占位符替代直接拼接字符串
    Cursor c = db.rawQuery(" SELECT DISTINCT " + KEY_QUESTION + " from " + TABLE_QUESTION 
            + " where " + KEY_QUESTION + " LIKE ?", new String[]{"%" + searchKeyword + "%"});
    
    if (c != null && c.moveToFirst()) {
        do {
            String t1 = c.getString(c.getColumnIndexOrThrow(KEY_QUESTION));
            lst.add(t1);
        } while (c.moveToNext());
        c.close();
    }
    db.close();
    return lst;
}

然后在Activity里给AutoCompleteTextView添加文本变化监听,实时更新适配器数据:

txt.addTextChangedListener(new TextWatcher() {
    @Override
    public void beforeTextChanged(CharSequence s, int start, int count, int after) {}

    @Override
    public void onTextChanged(CharSequence s, int start, int before, int count) {
        String keyword = s.toString();
        ArrayList<String> filteredQuestions = md.getQuestionForSearch(keyword);
        myadap.clear();
        myadap.addAll(filteredQuestions);
        myadap.notifyDataSetChanged();
    }

    @Override
    public void afterTextChanged(Editable s) {}
});

3. 调整AutoCompleteTextView的提示阈值

默认情况下,AutoCompleteTextView需要输入2个字符才会显示提示,如果你想输入1个字符就提示,给布局里的控件加这个属性:

<AutoCompleteTextView 
    ...
    android:completionThreshold="1" />

4. 移除无用的初始化代码

你在初始化时写的String search= txt.getText().toString();,这时候输入框是空的,完全没有实际作用,可以直接删掉。

按以上步骤修改后,AutoCompleteTextView应该就能正常显示提示了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:59:02