如何修改代码实现展示所有注册用户及关注用户的Firebase帖子
问题根因
- 你的原有代码查询路径为
FirebaseDatabase.getInstance().reference.child("Catalog").child(uid!!),直接限定了仅拉取当前登录用户自己发布的帖子,自然无法获取其他用户的内容 - 原有筛选逻辑仅匹配关注列表用户,未覆盖所有注册用户的展示需求,同时列表刷新方法放在内层循环中,会频繁触发界面重绘,存在性能问题
修正后Kotlin代码
参考你提供的数据库结构,Catalog节点下第一级是所有发布帖子的用户UID,每个UID节点下存储对应用户发布的所有帖子,我们需要遍历全量用户的帖子数据再做筛选:
private fun retrievePosts() { progressBar!!.visibility = View.VISIBLE // 直接查询整个Catalog节点,获取所有用户的全量帖子 val postsRef = FirebaseDatabase.getInstance().reference.child("Catalog") postsRef.addValueEventListener(object : ValueEventListener { override fun onDataChange(p0: DataSnapshot) { val tempList = arrayListOf<ModelPost>() // 第一层遍历:所有发布过帖子的用户节点 for (userSnapshot in p0.children) { // 第二层遍历:单个用户的所有帖子 for (postSnapshot in userSnapshot.children) { val post = postSnapshot.getValue(ModelPost::class.java) ?: continue // 此处为筛选逻辑:所有注册用户的帖子都展示 tempList.add(post) // 如果你后续需要调整为仅展示关注用户+自己的帖子,把上面的add替换为下面的判断即可 // if (followingList.contains(post.getUid()) || post.getUid() == uid) tempList.add(post) } } // 统一更新列表,避免频繁刷新 postList.clear() postList.addAll(tempList) adapterPost!!.notifyDataSetChanged() progressBar!!.visibility = View.GONE } override fun onCancelled(p0: DatabaseError) { progressBar!!.visibility = View.GONE } }) }
Java版本参考代码
private void retrievePosts() { progressBar.setVisibility(View.VISIBLE); DatabaseReference postsRef = FirebaseDatabase.getInstance().getReference().child("Catalog"); postsRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { ArrayList<ModelPost> tempList = new ArrayList<>(); for (DataSnapshot userSnapshot : snapshot.getChildren()) { for (DataSnapshot postSnapshot : userSnapshot.getChildren()) { ModelPost post = postSnapshot.getValue(ModelPost.class); if (post == null) continue; // 所有注册用户的帖子都加入列表 tempList.add(post); // 仅展示关注用户+自己的帖子的判断逻辑 // if (followingList.contains(post.getUid()) || post.getUid().equals(uid)) tempList.add(post); } } postList.clear(); postList.addAll(tempList); adapterPost.notifyDataSetChanged(); progressBar.setVisibility(View.GONE); } @Override public void onCancelled(@NonNull DatabaseError error) { progressBar.setVisibility(View.GONE); } }); }
内容的提问来源于stack exchange,提问作者Apple Juice
相关产品推荐
相关产品推荐

