Android开发Fragment向RecyclerViewAdapter传递对象列表长度为0故障排查
问题修复方案
根因分析
你代码的核心问题是列表引用不同步:
- 初始化时你创建了
shoppingItemList = new ArrayList<ShoppingItem>()对象,将其传入RecyclerViewAdapter中,此时Adapter持有这个空列表的引用 - 后续你在
populateitemList()方法中执行了shoppingItemList=databaseHandler.getAllItem(),这一步是将Fragment中的shoppingItemList变量指向了数据库返回的新列表对象,而Adapter持有的仍然是最开始的那个空列表的引用,两边指向的不是同一个对象,因此Adapter拿到的size永远为0
修复步骤
- 修改
populateitemList()方法,不要直接给shoppingItemList重新赋值,而是将数据库查询到的内容添加到已有的列表对象中,保证Adapter和Fragment持有的是同一个列表引用 - 列表数据更新后调用Adapter的
notifyDataSetChanged()通知界面刷新 - 可选优化:给
populateDB()增加数据存在判断,避免每次进入Fragment重复插入模拟数据
修改后的代码示例
修改populateitemList方法
private void populateitemList() { if (shoppingItemList!=null){ shoppingItemList.clear(); } // 先把查询结果存到临时列表 List<ShoppingItem> dbResult = databaseHandler.getAllItem(); // 可加日志确认数据库查询是否正常返回2条数据 System.out.println("数据库查询到的条目数:" + dbResult.size()); // 把查询结果添加到已有列表中,不更换引用对象 shoppingItemList.addAll(dbResult); for(int i=0;i<shoppingItemList.size();i++){ System.out.println(shoppingItemList.get(i).getName()); } // 通知适配器数据更新 if(recyclerViewAdapter != null){ recyclerViewAdapter.notifyDataSetChanged(); } }
优化populateDB方法(避免重复插入数据)
private void populateDB() { // 仅当数据库无数据时插入模拟数据 if(databaseHandler.getAllItem().size() == 0){ databaseHandler.addItem(new ShoppingItem(1,"bread","testing1","1","Small",1)); databaseHandler.addItem(new ShoppingItem(2,"rice","testing2","2","Medium",0)); } }
内容的提问来源于stack exchange,提问作者legna
相关产品推荐
相关产品推荐

