如何通过EditText搜索SQLite中插入的数据并过滤ListView展示内容
你现有代码存在3个核心问题:
- SQL查询语句固定写死了匹配
%name%,没有使用搜索框输入的实际关键词 - TextWatcher的文本变化回调全为空,输入内容变动时没有触发搜索逻辑
- 查询得到游标后,没有将数据转换为列表适配所需的Model集合,也没有通知ListView刷新内容
- 额外逻辑bug:当前判断游标数量>0时弹出「未找到」提示,逻辑完全相反,>0代表查询到匹配结果,<=0才是无匹配
1. 全局变量准备
首先在RecordListActivity中声明全局需要用到的变量,确保你已经初始化过ListView和对应的适配器:
// 全局存储当前展示的列表数据 private List<Model> mDisplayList = new ArrayList<>(); // 你自己实现的ListView适配器,继承BaseAdapter即可 private RecordAdapter mAdapter;
2. 补全TextWatcher文本监听逻辑
修改你的搜索框监听代码,输入内容变化时触发搜索:
mSearchView.addTextChangedListener(new TextWatcher() { @Override public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) { } @Override public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) { // 输入内容变化时触发搜索,传入输入的关键词 searchRecord(charSequence.toString().trim()); } @Override public void afterTextChanged(Editable editable) { } });
3. 实现搜索逻辑方法,修正SQL查询
在RecordListActivity中新增搜索方法,正确构造查询语句,处理查询结果:
private void searchRecord(String keyword) { // 清空原有展示数据 mDisplayList.clear(); // 关键词为空时展示全部数据,可根据需求调整 if (keyword.isEmpty()) { // 这里调用你自己查询全部记录的方法即可,示例查询全部 Cursor allCursor = mSQLiteHelper.searchData("Select id, name, phone from RECORD"); cursorToList(allCursor); mAdapter.notifyDataSetChanged(); return; } // 正确构造带关键词的查询语句,用占位符避免SQL注入 String selectSql = "Select id, name, phone from RECORD Where name like ?"; String[] args = new String[]{"%" + keyword + "%"}; Cursor cursor = mSQLiteHelper.getReadableDatabase().rawQuery(selectSql, args); // 无匹配结果提示 if (cursor.getCount() <= 0) { Toast.makeText(RecordListActivity.this, "未找到匹配结果", Toast.LENGTH_SHORT).show(); } else { // 有结果则转换为Model列表 cursorToList(cursor); } // 通知适配器刷新列表 mAdapter.notifyDataSetChanged(); cursor.close(); }
4. 实现游标转Model列表的公用方法
private void cursorToList(Cursor cursor) { if (cursor.moveToFirst()) { do { int id = cursor.getInt(cursor.getColumnIndexOrThrow("id")); String name = cursor.getString(cursor.getColumnIndexOrThrow("name")); String phone = cursor.getString(cursor.getColumnIndexOrThrow("phone")); mDisplayList.add(new Model(id, name, phone)); } while (cursor.moveToNext()); } }
适配说明
你的RecordAdapter需要绑定mDisplayList作为数据源,正常实现getCount、getItem、getView等方法即可,每次搜索后调用notifyDataSetChanged就能自动刷新列表展示匹配结果。
内容的提问来源于stack exchange,提问作者Ibnul Imtiaz
相关产品推荐
相关产品推荐

