Android 导航抽屉架构下Slideshow Fragment中RecyclerView不显示问题求助
问题原因及修复方案
核心问题:异步请求数据后未通知适配器刷新
Firestore的get()方法是异步网络请求,你当前代码的执行顺序是:
- 初始化空的
myDataset集合 - 发起Firestore异步数据请求
- 直接用空的
myDataset初始化适配器、设置给RecyclerView,此时适配器getItemCount()返回0,RecyclerView不会触发任何item的绘制逻辑 - 等异步请求完成、数据存入
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,提问作者황순규
相关产品推荐
相关产品推荐

