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

如何通过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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.08 09:30:04