Kotlin Fragment中Realtime Database取数日志可见但RecyclerView不显示问题
问题核心原因
- 数据传递链路完全断裂:从数据库读出的有效数据没有送入已绑定到RecyclerView的适配器,自然无法展示
- 重复实例化逻辑冗余:每次
onChildAdded回调都新建传入空列表的BalAdapter,但这个新适配器从未和RecyclerView绑定,完全不影响UI - 数据对象没有留存:代码中临时new的
UserInfo.Uids没有被任何变量持有,执行完就被回收,没有存入任何数据源
原代码的具体无效点
- 绑定到RecyclerView的适配器,初始化时传入的是新建的空
ArrayList,自始至终没有接收到数据库返回的有效数据 if (bal != null)块内仅单独new了一个UserInfo.Uids实例,既没有加入列表,也没有传给适配器,相当于读取后直接丢弃- 回调中打印的
UserInfo.Uids().toString()日志,对应的是无参构造的空对象,和实际从数据库拿到的bal没有关系 - 回调中新建的空列表、空适配器,因为没有执行
view.recyclerView.adapter = 新adapter的绑定操作,对UI没有任何影响
修正后的可运行实现
- 在
onCreateView阶段提前创建数据源、完成适配器和RecyclerView的绑定,避免重复初始化:
override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { val view = inflater.inflate(R.layout.fragment_chat_list, container, false) // 提前创建可变数据源 val dataList = arrayListOf<UserInfo.Uids>() // 初始化适配器,直接引用该数据源 adapter = BalAdapter(requireContext(), dataList, R.layout.users) // 配置RecyclerView view.recyclerView?.setHasFixedSize(true) view.recyclerView?.layoutManager = LinearLayoutManager(context) view.recyclerView?.adapter = adapter // 添加数据库监听 ref?.addChildEventListener(object : ChildEventListener { override fun onChildAdded(snapshot: DataSnapshot, previousChildName: String?) { val bal = snapshot.getValue<UserInfo.Uids>() ?: return // 把读到的有效数据加入已有数据源 dataList.add(bal) // 通知适配器更新对应位置 adapter?.notifyItemInserted(dataList.lastIndex) Log.d("RecyclerView", bal.toString()) } override fun onChildChanged(snapshot: DataSnapshot, previousChildName: String?) {} override fun onChildRemoved(snapshot: DataSnapshot) {} override fun onChildMoved(snapshot: DataSnapshot, previousChildName: String?) {} override fun onCancelled(p0: DatabaseError) {} }) return view }
- 后续数据库返回新数据时,仅需操作已绑定的数据源列表、通知适配器刷新即可,不需要再重新创建适配器或空列表。
内容的提问来源于stack exchange,提问作者Raphael Inyang
相关产品推荐
相关产品推荐

