如何将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
相关产品推荐
相关产品推荐

