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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 17:24:27