Android中FirestoreRecyclerAdapter绑定RecyclerView不显示用户列表
解决FirestoreRecyclerAdapter加载空白列表的问题
我帮你排查了代码里的几个关键问题,这些都是导致RecyclerView空白的常见原因,咱们一步步来修复:
1. 忘记启动Firestore数据监听
FirestoreRecyclerAdapter不会自动开始监听数据变化,必须在Activity的生命周期方法里手动启动/停止监听。另外你现在的adapter是onCreate里的局部变量,得改成类成员变量才能在生命周期方法里访问:
首先在类顶部声明适配器变量:
public class UserSearch extends AppCompatActivity { private RecyclerView rv; private ProgressBar mProgressbar; private CollectionReference mUser; private FirestoreRecyclerAdapter<Users, FriendsHolder> adapter; // 新增类成员变量 // ... 其他代码 }
然后在onCreate里初始化适配器时去掉前面的类型声明:
adapter = new FirestoreRecyclerAdapter<Users, FriendsHolder>(options) { // ... 内部实现不变 };
最后添加生命周期方法启动/停止监听:
@Override protected void onStart() { super.onStart(); adapter.startListening(); } @Override protected void onStop() { super.onStop(); adapter.stopListening(); }
2. onBindViewHolder参数类型错误
你这里的users model大小写写错了,应该是Users model,这会导致编译错误或者无法正确获取数据:
@Override protected void onBindViewHolder(FriendsHolder holder, int position, Users model) { // 修正为Users holder.nameText.setText(model.getName()); holder.emailText.setText(model.getEmail()); }
3. Firestore字段映射不匹配
你的实体类Users里的成员变量是Name和Email(大写开头),如果Firestore集合users里的文档字段是小写的name和email,Firebase的序列化器会找不到对应字段,导致加载的数据为空。推荐两种修复方式:
- 方式一:修改Firestore文档的字段名,和实体类保持一致(
Name、Email) - 方式二:给实体类的getter/setter添加
@PropertyName注解,指定Firestore里的字段名(同时建议把成员变量改成小写开头,符合Java编码规范):
public class Users { private String name; private String email; public Users(){} @PropertyName("name") public String getName() { return name; } @PropertyName("name") public void setName(String name) { this.name = name; } @PropertyName("email") public String getEmail() { return email; } @PropertyName("email") public void setEmail(String email) { this.email = email; } public Users(String name, String email) { this.name = name; this.email = email; } }
4. 检查Firestore安全规则
确保你的Firestore安全规则允许读取users集合,否则会被拒绝访问导致没有数据返回。可以先临时设置成开放测试(上线前一定要修改为严格的权限规则):
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /{document=**} { allow read, write: if true; } } }
5. 可选:添加数据加载状态提示
你布局里有ProgressBar,但代码里没处理显示/隐藏,可以在适配器里重写onDataChanged方法,数据加载完成后隐藏进度条:
@Override public void onDataChanged() { super.onDataChanged(); mProgressbar.setVisibility(View.GONE); }
按照上面的步骤修改后,应该就能正常加载用户列表了。
内容的提问来源于stack exchange,提问作者Anurag Tiwari
相关产品推荐
相关产品推荐

