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

Fragment中ArrayList始终返回size=0,SQLite数据无法在RecyclerView展示

问题:Fragment中RecyclerView绑定SQLite数据时ArrayList始终为空,即使数据库有数据

我在Fragment里用RecyclerView展示SQLite数据库的数据,同时设置了一个TextView,打算在ArrayList.size() == 0时显示“暂无数据”的提示,有数据时就隐藏它。但现在遇到了麻烦:明明数据库里已经有数据了,可ArrayList.size()始终返回0,导致提示一直显示,RecyclerView也没内容。

我添加数据到数据库的代码片段如下:

add.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
        TextView errorWeight = (TextView)weight.getSelectedView(); 
        TextView errorPer = (TextView) // 此处代码未完成,核心是获取输入内容并写入数据库
        // 后续添加数据到SQLite的逻辑
    }
});

问题排查与解决方案

咱们一步步来定位问题——既然数据库有数据但ArrayList是空的,大概率是读取数据到ArrayList的逻辑出了问题,当然也得先确认数据真的成功写入了。

第一步:先确认数据真的进了SQLite

你可以用Android Studio的Device File Explorer,找到APP的数据库文件(路径一般是data/data/你的包名/databases/),导出后用SQLite可视化工具(比如SQLiteStudio)打开,看看表里有没有你添加的数据。如果数据没写进去,先排查添加环节:

  • 检查ContentValues是否正确赋值,有没有把输入的内容存进去
  • 检查SQLiteOpenHelper的insert方法调用是否正确,有没有捕获异常
  • 确认添加完成后,有没有触发重新读取数据的操作

第二步:排查读取数据到ArrayList的核心逻辑

这是最可能出问题的地方,重点检查这几点:

  1. SQL查询语句是否正确:有没有写错表名、列名,比如是不是漏了SELECT * FROM 表名这类基础语句
  2. Cursor的处理是否规范:
    • 有没有调用cursor.moveToFirst()?如果没移动到第一条记录,后续的循环根本不会执行
    • 循环读取时,有没有正确获取列值并添加到ArrayList?
      给你一个标准的读取示例参考:
    public List<YourDataModel> getAllData() {
        List<YourDataModel> dataList = new ArrayList<>();
        SQLiteDatabase db = this.getReadableDatabase();
        Cursor cursor = db.rawQuery("SELECT * FROM your_table_name", null);
        
        if (cursor != null) {
            // 必须先移动到第一条记录
            if (cursor.moveToFirst()) {
                do {
                    // 根据列名获取对应索引,再读取数据
                    String weight = cursor.getString(cursor.getColumnIndex("weight_column"));
                    String per = cursor.getString(cursor.getColumnIndex("per_column"));
                    // 创建数据模型并加入列表
                    dataList.add(new YourDataModel(weight, per));
                } while (cursor.moveToNext());
            }
            cursor.close(); // 用完Cursor一定要关闭,避免内存泄漏
        }
        db.close();
        return dataList;
    }
    
  3. 读取时机是否正确:
    • 比如在Fragment的onViewCreated或onResume里,有没有调用读取数据的方法,把返回的ArrayList赋值给RecyclerView的Adapter?
    • 添加数据完成后,有没有重新调用读取方法,然后更新Adapter的数据集并调用notifyDataSetChanged()?

第三步:检查TextView的显示逻辑

假设ArrayList已经正确获取到数据了,还要确认显示判断逻辑没问题:

// 更新数据后执行判断
if (dataList.size() == 0) {
    emptyTextView.setVisibility(View.VISIBLE);
    recyclerView.setVisibility(View.GONE);
} else {
    emptyTextView.setVisibility(View.GONE);
    recyclerView.setVisibility(View.VISIBLE);
    adapter.setData(dataList); // 假设Adapter有设置数据的方法
    adapter.notifyDataSetChanged();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 10:20:32