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

