Android中ArrayList添加JSON解析数据后仍为空问题求助
问题原因与解决方案
核心问题:异步请求的时序问题
你遇到的问题本质是Volley网络请求是异步操作:
- 调用
getmajors()后,代码会立刻继续执行onCreate()里的打印和Adapter初始化逻辑,此时网络请求还在后台跑,majorsArrayList自然是空的。 onResponse()里的打印和数据添加是在请求成功后才触发的,但这时候Adapter已经初始化完成,且没有收到数据更新的通知。
另外还要确保majorsArrayList已经被正确实例化,比如在类成员中初始化:
private ArrayList<Majors> majorsArrayList = new ArrayList<>(); private recycler_majorAdapter recyclerMajorAdapter;
修改后的代码实现
1. 调整onCreate()逻辑,先绑定RecyclerView和Adapter
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); RecyclerView recyclerView = findViewById(R.id.recyclerViewMajors); // 先初始化Adapter并绑定到RecyclerView recyclerMajorAdapter = new recycler_majorAdapter(this, majorsArrayList); recyclerView.setAdapter(recyclerMajorAdapter); recyclerView.setLayoutManager(new LinearLayoutManager(this)); // 最后发起网络请求 getmajors("Al-Kafaat University","Faculty of Pedagogy","faculty","en"); }
2. 在onResponse()中完成数据更新并通知Adapter
private void getmajors(String uni, String faculty, String dest, String lang) { StringRequest stringRequest=new StringRequest(Request.Method.GET, "https://...", new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONArray opp =new JSONArray(response); // 清空旧数据避免重复加载 majorsArrayList.clear(); for (int i = 0; i< opp.length(); i++) { JSONObject pollObject= opp.getJSONObject(i); String major=pollObject.getString("maj"); String university=pollObject.getString("univ"); int id=pollObject.getInt("id"); Majors m=new Majors(major,university, id); majorsArrayList.add(m); } // 关键:通知Adapter数据已更新,RecyclerView才会刷新 recyclerMajorAdapter.notifyDataSetChanged(); System.out.println("ARRAYLIST after load: "+majorsArrayList); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { Toast.makeText(MainActivity.this,error.getMessage(),Toast.LENGTH_LONG).show(); } }); Volley.newRequestQueue(this).add(stringRequest); }
关键说明
- 异步请求不会阻塞主线程,所以
onCreate()里的代码会先于onResponse()执行,必须等数据加载完成后再通知UI刷新。 - 调用
notifyDataSetChanged()是让Adapter感知到数据源变化,从而重新渲染RecyclerView的列表项。
内容的提问来源于stack exchange,提问作者Mah
相关产品推荐
相关产品推荐

