Fragment中RecyclerView无法显示数据求助
问题修复方案
以下是你的代码中导致数据无法展示的核心问题及修复方式:
1. Adapter初始化时机错误
你在onCreateView中直接给RecyclerView设置了未初始化的adapter(此时adapter为null),还调用了adapter.notifyDataSetChanged(),会直接引发空指针异常。
修复代码(修改onCreateView):
@Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { binding = FragmentGalleryBinding.inflate(inflater, container, false); View root = binding.getRoot(); recyclerView = root.findViewById(R.id.recyclerView); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); recyclerView.setHasFixedSize(true); // 先初始化数据列表,再创建Adapter并绑定到RecyclerView heroList = new ArrayList<>(); adapter = new HeroAdapter(heroList, getContext()); recyclerView.setAdapter(adapter); return root; }
2. Volley请求未加入请求队列
loadHeroes方法中创建了StringRequest,但没有将其添加到Volley的RequestQueue中,导致网络请求根本没有执行,无法获取数据。
修复代码(修改loadHeroes方法):
private void loadHeroes() { StringRequest stringRequest = new StringRequest(Request.Method.GET, URL_GET_DATA, new Response.Listener<String>() { @Override public void onResponse(String response) { try { JSONArray jsonArray = new JSONArray(response); for (int i = 0; i < jsonArray.length(); i++) { JSONObject obj = jsonArray.getJSONObject(i); Hero hero = new Hero( obj.getString("name"), obj.getString("realname"), obj.getString("team"), obj.getString("firstappearance"), obj.getString("createdby"), obj.getString("publisher"), obj.getString("imageurl"), obj.getString("bio") ); heroList.add(hero); } // 数据加载完成后通知Adapter更新列表 adapter.notifyDataSetChanged(); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { error.printStackTrace(); // 打印错误信息方便调试 } }); // 将请求加入Volley队列,执行网络请求 RequestQueue queue = Volley.newRequestQueue(getContext()); queue.add(stringRequest); }
3. Adapter加载了错误的布局
HeroAdapter的onCreateViewHolder中,你加载的是Fragment的布局R.layout.fragment_gallery,这是整个页面的布局,不是单个列表项的布局。你需要创建一个单独的列表项布局(比如item_hero.xml),包含textViewName、imageView等控件,然后修改Adapter的布局加载代码:
修复代码(修改HeroAdapter的onCreateViewHolder):
@Override public HeroViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); // 替换成你的列表项布局 View view = inflater.inflate(R.layout.item_hero, parent, false); return new HeroViewHolder(view); }
4. 数据更新后未通知Adapter
在网络请求成功获取数据并添加到heroList后,必须调用adapter.notifyDataSetChanged(),让RecyclerView刷新展示新数据(已在上面的loadHeroes修复中加入)。
额外优化点
- 移除
onCreateView中重复定义的FragmentGalleryBinding binding,直接使用成员变量。 - 在
onDestroyView中添加binding = null;,避免内存泄漏:
@Override public void onDestroyView() { super.onDestroyView(); binding = null; }
内容的提问来源于stack exchange,提问作者Jessica Clark
相关产品推荐
相关产品推荐

