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的核心逻辑
这是最可能出问题的地方,重点检查这几点:
- SQL查询语句是否正确:有没有写错表名、列名,比如是不是漏了
SELECT * FROM 表名这类基础语句 - 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; } - 有没有调用
- 读取时机是否正确:
- 比如在Fragment的
onViewCreated或onResume里,有没有调用读取数据的方法,把返回的ArrayList赋值给RecyclerView的Adapter? - 添加数据完成后,有没有重新调用读取方法,然后更新Adapter的数据集并调用
notifyDataSetChanged()?
- 比如在Fragment的
第三步:检查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
相关产品推荐
相关产品推荐

