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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 00:02:02