You need to enable JavaScript to run this app. Android 导航抽屉架构下Slideshow Fragment中RecyclerView不显示问题求助
优惠活动
大模型
产品
解决方案
定价
更多

Android 导航抽屉架构下Slideshow Fragment中RecyclerView不显示问题求助

问题原因及修复方案

核心问题:异步请求数据后未通知适配器刷新

Firestore的get()方法是异步网络请求,你当前代码的执行顺序是:

  1. 初始化空的myDataset集合
  2. 发起Firestore异步数据请求
  3. 直接用空的myDataset初始化适配器、设置给RecyclerView,此时适配器getItemCount()返回0,RecyclerView不会触发任何item的绘制逻辑
  4. 等异步请求完成、数据存入myDataset后,没有通知适配器数据发生变更,RecyclerView不会自动重绘

具体修复步骤

1. 异步加载完成后通知适配器刷新

修改SlideshowFragment.java中的Firestore请求逻辑,数据全部加载完成后调用刷新方法:

db.collection("SDattributes")
        .get()
        .addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
            @Override
            public void onComplete(@NonNull Task<QuerySnapshot> task) {
                if (task.isSuccessful()) {
                    for (QueryDocumentSnapshot document : task.getResult()) {
                        SingleDish sd = document.toObject(SingleDish.class);
                        myDataset.add(sd);
                    }
                    // 新增:通知适配器数据已变更,触发重绘
                    mAdapter.notifyDataSetChanged();
                } else
                    Log.d("Log.d", "Failed" + "\n" + task.getException());
            }
        });

2. 修复潜在崩溃问题

MyAdapter.java的onBindViewHolder方法中,holder.tvRanking.setText(position)直接传入int类型的position,会被系统识别为字符串资源ID,大概率触发资源找不到的崩溃,修改为转字符串即可:

// 错误写法
// holder.tvRanking.setText(position);
// 修复写法(+1是让排名从1开始,符合普通用户使用习惯)
holder.tvRanking.setText(String.valueOf(position + 1));

3. 可选排查项

如果修改后仍无显示,检查fragment_slideshow.xml中的RecyclerView配置:

  • 确保layout_width和layout_height设置为match_parent,不要使用wrap_content
  • 确认RecyclerView的id为my_recycler_view,和代码中findViewById的id一致

内容的提问来源于stack exchange,提问作者황순규

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.18 05:57:00