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

如何将MySQL数据加载到RecyclerView?解决空指针异常问题

解决RecyclerView Adapter空指针异常问题

问题根源

空指针异常的直接原因是RecyclerView Adapter加载了错误的布局文件:
在UserAdapter的onCreateViewHolder方法中,你加载的是activity_main2.xml(该布局仅包含RecyclerView控件),但textTitle、textType、textLocation这些TextView实际定义在activity_list.xml布局里。ViewHolder无法找到目标控件,导致Name、Type、Location为null,调用setText时触发异常。

核心修复

修改UserAdapter中的onCreateViewHolder方法,加载正确的item布局:

@NonNull
@Override
public UserHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    // 将R.layout.activity_main2改为R.layout.activity_list
    View userLayout = LayoutInflater.from(parent.getContext()).inflate(R.layout.activity_list, parent, false);
    return new UserHolder(userLayout);
}

额外优化建议

1. 简化实体类对象创建

给Users类添加带参数的构造方法,避免重复调用setter:

public class Users {
    private String name, type, location;

    // 新增带参构造方法
    public Users(String name, String type, String location) {
        this.name = name;
        this.type = type;
        this.location = location;
    }

    // 保留原有的getter和setter
    public String getName() { return name; }
    public void setName(String name) { this.name = name; }
    public String getType() { return type; }
    public void setType(String type) { this.type = type; }
    public String getLocation() { return location; }
    public void setLocation(String location) { this.location = location; }
}

之后在MainActivity2中创建对象可简化为:

Users user = new Users(name, type, location);
usersList.add(user);

2. 避免空列表崩溃

在UserAdapter的getItemCount中添加空判断,防止usersList为null时崩溃:

@Override
public int getItemCount() {
    return usersList == null ? 0 : usersList.size();
}

3. 优化Adapter初始化逻辑

提前初始化Adapter,请求成功后仅通知数据更新,无需重新创建Adapter:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main2);

    recyclerView = findViewById(R.id.recylcerList);
    recyclerView.setHasFixedSize(true);
    recyclerView.setLayoutManager(new LinearLayoutManager(this));

    usersList = new ArrayList<>();
    // 提前初始化Adapter并设置给RecyclerView
    userAdapter = new UserAdapter(MainActivity2.this, usersList);
    recyclerView.setAdapter(userAdapter);

    LoadAllUser();
}

private void LoadAllUser() {
    JsonArrayRequest request = new JsonArrayRequest(URL, new Response.Listener<JSONArray>() {
        @Override
        public void onResponse(JSONArray array) {
            usersList.clear(); // 清空旧数据,避免重复添加
            for (int i = 0; i < array.length(); i++) {
                try {
                    JSONObject object = array.getJSONObject(i);
                    String name = object.getString("eventname").trim();
                    String type = object.getString("type").trim();
                    String location = object.getString("location").trim();

                    Users user = new Users(name, type, location);
                    usersList.add(user);
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
            // 仅通知Adapter数据已更新
            userAdapter.notifyDataSetChanged();
        }
    }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Toast.makeText(MainActivity2.this, error.toString(), Toast.LENGTH_SHORT).show();
        }
    });
    RequestQueue requestQueue = Volley.newRequestQueue(MainActivity2.this);
    requestQueue.add(request);
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 09:45:35