Android Kotlin对接Firebase时RecyclerView用户列表不显示问题
问题排查结果
两处代码错误直接导致了你描述的异常现象:
- Firebase数据解析逻辑写错
你在监听users节点数据的回调里,循环遍历子节点时,错误地使用了父节点snapshot做数据解析,没有使用当前循环到的子节点postSnapshot。这意味着你每次拿到的currentUser都是整个users根节点转换出的无效对象,name字段为null,自然不会在TextView上显示用户名。
错误代码位置:
修正写法:for (postSnapshot in snapshot.children){ // 错误:用了外层的snapshot,不是当前遍历的postSnapshot val currentUser = snapshot.getValue(User::class.java) userList.add(currentUser!!) }for (postSnapshot in snapshot.children){ val currentUser = postSnapshot.getValue(User::class.java) // 建议加空判断避免脏数据导致崩溃 currentUser?.let { userList.add(it) } } - 列表项布局高度配置错误
你的列表项布局user_layout.xml根布局高度设置为了match_parent,会导致单个列表项直接占满整个RecyclerView的视口高度。结合上面的解析错误,第一个列表项的TextView因为name为null不显示内容,只有下方的分割线可见,剩下的列表项全部被挤到屏幕外,就出现了你看到的“只有一条分割线、页面可滚动但看不到用户数据”的现象。
修正布局配置,把根布局高度改为wrap_content:<?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content"> <!-- 其余内部布局代码保持不变 --> </RelativeLayout>
额外注意点
onCancelled回调里不要留TODO("Not yet implemented"),数据库权限不足、网络异常时会直接触发崩溃,至少要加错误日志打印,或者给用户弹出对应提示。- 尽量不要用
!!强制非空,数据库里如果存在格式不符合User类的脏数据,会直接触发空指针崩溃,加空判断过滤异常数据更稳妥。
内容的提问来源于stack exchange,提问作者Michael Chirozidi
相关产品推荐
相关产品推荐

