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

调用API填充ArrayList后列表仍显示为空该如何解决?

问题根源

这是典型的异步网络请求时序问题:Volley的网络请求是异步执行的,不会阻塞主线程的onCreate执行流程。你在调用parseJSON()之后立刻打印teams的size,此时网络请求还没有拿到服务端返回结果,回调中的列表插入逻辑还没执行,所以得到的是空列表的size,不是数据没有存进去,是你打印的时机早于请求完成的时间。

修复步骤
  • 首先将TeamNamesAdapter调整为MainActivity的成员变量,方便请求回调中访问:
public class MainActivity extends AppCompatActivity {

    private RequestQueue queue;
    private static ArrayList<Team> teams;
    // 新增适配器成员变量
    private TeamNamesAdapter teamNamesAdapter;

    // 其余原有代码不变
    ...
}
  • 修改onCreate中的适配器初始化逻辑,不要声明为局部变量:
// 替换原来的局部变量声明 TeamNamesAdapter teamNamesAdapter = new TeamNamesAdapter(teams);
teamNamesAdapter = new TeamNamesAdapter(teams);
  • 在JsonArrayRequest的成功回调中,所有数据插入列表完成后,通知适配器刷新界面,此时再打印列表size就是正确值:
response -> {
    try {
        for(int i=0;i<response.length();i++){
            JSONObject teamDetails = response.getJSONObject(i);
            Team team = new Team();
            team.setId(Long.parseLong(teamDetails.getString("id")));
            team.setTeamName(teamDetails.getString("teamName"));
            team.setTotalMatches(Long.parseLong(teamDetails.getString("totalMatches")));
            team.setTotalWins(Long.parseLong(teamDetails.getString("totalWins")));
            this.teams.add(team);
            Log.i("Info","Added team "+team.getTeamName()+" successfully");
        }
        // 新增:通知适配器数据已更新,列表会自动刷新渲染
        teamNamesAdapter.notifyDataSetChanged();
        // 此时打印的size才是正确的列表长度
        Log.i("Info","列表实际大小:"+String.valueOf(teams.size()));
    } catch (JSONException e) {
        e.printStackTrace();
    }
}
  • 所有需要依赖API返回数据执行的逻辑,都要放在请求的成功/失败回调中执行,不能放在parseJSON()调用之后的onCreate代码段中,此时请求还未完成数据还没加载。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.19 01:15:04