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

Android开发Fragment向RecyclerViewAdapter传递对象列表长度为0故障排查

问题修复方案

根因分析

你代码的核心问题是列表引用不同步:

  • 初始化时你创建了shoppingItemList = new ArrayList<ShoppingItem>()对象,将其传入RecyclerViewAdapter中,此时Adapter持有这个空列表的引用
  • 后续你在populateitemList()方法中执行了shoppingItemList=databaseHandler.getAllItem(),这一步是将Fragment中的shoppingItemList变量指向了数据库返回的新列表对象,而Adapter持有的仍然是最开始的那个空列表的引用,两边指向的不是同一个对象,因此Adapter拿到的size永远为0

修复步骤

  1. 修改populateitemList()方法,不要直接给shoppingItemList重新赋值,而是将数据库查询到的内容添加到已有的列表对象中,保证Adapter和Fragment持有的是同一个列表引用
  2. 列表数据更新后调用Adapter的notifyDataSetChanged()通知界面刷新
  3. 可选优化:给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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 03:15:09