RecyclerView布局不显示:应用时隔一月点击按钮跳转空白页面
嘿,这种隔了段时间代码突然罢工的情况真的让人头疼!我仔细看了你的代码和描述,几个关键点应该能解决你的RecyclerView空白、跳转无内容的问题:
1. 模型类的低级错误(最可能的直接原因)
你的RestaurantDetails里的setLatitude方法写崩了!看这段:
public void setLatitude(Double lang) {this.latitude = latitude;}
参数是lang,但你赋值的时候用了latitude = latitude——等于啥都没改!Firebase在序列化对象时,这个字段会被设为null,甚至可能导致整个对象映射失败,直接让RecyclerView拿不到数据。
赶紧改成正确的:
public void setLatitude(Double latitude) {this.latitude = latitude;}
2. Firebase数据库规则变更(高频坑)
隔了一个月没碰,很大概率你之前用的是测试用的开放规则,现在Firebase自动把规则切换成了仅认证用户可访问,导致你的App拉不到数据,RecyclerView自然是空的。
去Firebase控制台的「实时数据库」→「规则」页面检查:
- 如果是下面这种私有规则,未登录用户根本拿不到数据:
{ "rules": { ".read": "auth != null", ".write": "auth != null" } } - 临时测试可以改成开放规则(上线前一定要改回安全规则!):
{ "rules": { ".read": true, ".write": true } }
如果改完后RecyclerView显示内容了,那就是规则的锅,后续记得配置正确的身份验证和权限规则。
3. Adapter里的冗余代码(虽不直接报错,但留着隐患)
你的RestaurantAdapter里重复定义了FirebaseRecyclerOptions options成员变量,但构造函数已经接收了外部传入的options,这个内部的options完全没用,还容易混淆逻辑,建议删掉这段:
// 删掉这段冗余代码 FirebaseRecyclerOptions<RestaurantDetails> options = new FirebaseRecyclerOptions.Builder<RestaurantDetails>() .setQuery(FirebaseDatabase.getInstance().getReference().child("Restaurant").child("Info"), RestaurantDetails.class) .build();
4. 跳转页面空白的排查方向
点击跳转后是空白页,大概率是RestaurantInfoActivity没正确处理传过来的post_key:
- 先确认这个Activity在
AndroidManifest.xml里注册了; - 检查接收参数的逻辑,加个日志看看有没有拿到值:
String postKey = getIntent().getStringExtra("post_key"); if (postKey == null) { Log.d("RestaurantInfo", "post_key 没传过来!"); return; } - 再确认加载数据的Firebase查询路径和
ResRecyclerViewActivity里的一致。
5. 加日志排查数据是否真的拉到了
虽然调试没报错,但可以手动加日志确认数据状态,在ResRecyclerViewActivity的onCreate里加这段:
FirebaseDatabase.getInstance().getReference().child("Restaurant").child("Info") .addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { Log.d(TAG, "拉到的数据总数: " + snapshot.getChildrenCount()); for (DataSnapshot ds : snapshot.getChildren()) { RestaurantDetails details = ds.getValue(RestaurantDetails.class); Log.d(TAG, "餐厅名称: " + details.getName()); } } @Override public void onCancelled(@NonNull DatabaseError error) { Log.e(TAG, "数据拉取失败原因: " + error.getMessage()); } });
这样就能明确是数据没拉到,还是拉到了但RecyclerView没渲染。
内容的提问来源于stack exchange,提问作者I.Z.

