【发布时间】:2021-12-16 17:08:59
【问题描述】:
我在 Firebase 实时数据库中有一个名为“Posts”的根节点。在其中,我有两个节点,分别称为“ImagePosts”和“TextPosts”。在“ImagePosts”(和“TextPosts”)中,我有各种帖子的 postId。在 postID 中,我拥有该特定帖子的所有详细信息,包括 postedAt(发布时间)。
我想要做的是编写一个查询以从“ImagePosts”和“TextPosts”中获取数据,并以降序/反向顺序显示所有帖子(也就是说,最后/最近发布的帖子应该显示根据“postedAt”,在我的回收站视图的顶部)。
Please click here to see database structure
为了实现这一点,我创建了一个名为 Post 的模型和两个名为“PostAdapter”和“TextPostAdapter”的适配器。我的回收站视图是“DashboardRV”。到目前为止我尝试了什么:
家庭片段代码:
public class HomeFragment extends Fragment {
ShimmerRecyclerView dashboardRV;
ArrayList<Post> postList;
public HomeFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_home, container, false);
dashboardRV = view.findViewById(R.id.dashboardRv);
dashboardRV.showShimmerAdapter();
postList = new ArrayList<>();
PostAdapter postAdapter = new PostAdapter(postList, getContext());
LinearLayoutManager layoutManager = new LinearLayoutManager(getContext());
dashboardRV.setLayoutManager(layoutManager);
dashboardRV.addItemDecoration(new DividerItemDecoration(dashboardRV.getContext(), DividerItemDecoration.VERTICAL));
dashboardRV.setNestedScrollingEnabled(false);
dashboardRV.setAdapter(postAdapter);
postList.clear();
database.getReference()
.child("Posts")
.child("ImagePosts")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
Post post = dataSnapshot.getValue(Post.class);
post.setPostId(dataSnapshot.getKey());
postList.add(post);
}
Collections.reverse(postList);
dashboardRV.hideShimmerAdapter();
postAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
database.getReference()
.child("Posts")
.child("TextPosts")
.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
postList.clear();
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
Post post = dataSnapshot.getValue(Post.class);
post.setPostId(dataSnapshot.getKey());
postList.add(post);
}
Collections.reverse(postList);
dashboardRV.hideShimmerAdapter();
textPostAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
但这种方法的问题在于它不会同时显示所有“TextPosts”和“ImagePosts”。它只显示打开应用程序上的所有图像帖子,然后当我更改片段并返回时,它会显示所有文本帖子。我只是卡在这里。
【问题讨论】:
-
您在哪里使用此代码?在片段或 ViewModel 或活动中
-
@DeePanShu 我已经在我的家庭片段中使用了这个代码。
-
您正在使用一个带有两个不同适配器的 recyclerview(dashboardRV)。这种方式适合你吗??
-
是的,我明白这可能是我的问题的原因,但我想在一个 RV 中显示所有帖子。请指导我该怎么做。
标签: java android firebase firebase-realtime-database google-cloud-platform