调用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
相关产品推荐
相关产品推荐

