我在 Firebase 實時資料庫中有一個名為“Posts”的根節點。在里面,我有兩個名為“ImagePosts”和“TextPosts”的節點。在“ImagePosts”(和“TextPosts”)中,我有各種帖子的 postId。在 postID 中,我擁有該特定帖子的所有詳細資訊,包括 postAt(發布時間)。
我想要做的是撰寫一個查詢以從“ImagePosts”和“TextPosts”中獲取資料并以降序/倒序顯示所有帖子(即,最后/最近發布的帖子應顯示在頂部在我的回收站視圖中根據“postedAt”)。
請點擊此處查看資料庫結構
為了實作這一點,我創建了一個名為 Post 的模型和兩個名為“PostAdapter”和“TextPostAdapter”的配接器。我的回收站視圖是“DashboardRV”。到目前為止我嘗試了什么:
Home Fragment 代碼:
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”。它只顯示打開應用程式上的所有影像帖子,然后當我更改片段并回傳時,它會顯示所有文本帖子。我只是被困在這里。
uj5u.com熱心網友回復:
一次只為一個回收者視圖使用一個配接器:
這是具有(影像和文本帖子)的單個配接器的代碼:
postList = new ArrayList<>();
PostAdapter postAdapter = new PostAdapter(postList, getContext());
dashboardRV.setAdapter(postAdapter);
// call clear before refreshing the list
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.sort(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) {
for (DataSnapshot dataSnapshot : snapshot.getChildren())
Post post = dataSnapshot.getValue(Post.class);
post.setPostId(dataSnapshot.getKey());
postList.add(post);
}
Collections.sort(postList);
dashboardRV.hideShimmerAdapter();
postAdapter.notifyDataSetChanged();
}
@Override
public void onCancelled(@NonNull DatabaseError error) {
}
});
// 使 Post 類實作與獲取后對串列進行排序相當:
// A class 'Post' that implements Comparable
class Post implements Comparable<Post>
{
...
// Used to sort posts by their postedAt
public int compareTo(Post p)
{
return this.postedAt - p.postedAt;
}
...
}
此鏈接將有助于探索如何根據postedAt 進行排序:Using Comparable
uj5u.com熱心網友回復:
要在本地合并 2 個單獨的 Firebase 實時資料庫請求,我建議您使用Tasks.whenAllSuccess()方法。您可以使用以下代碼行來實作這一點:
DatabaseReference imagePostsRef = database.getReference()
.child("Posts")
.child("ImagePosts");
DatabaseReference textPostsRef = database.getReference()
.child("Posts")
.child("TextPosts");
Task firstTask = imagePostsRef.get();
Task secondTask = textPostsRef.get();
Task combinedTask = Tasks.whenAllSuccess(firstTask, secondTask).addOnSuccessListener(new OnSuccessListener<List<Object>>() {
@Override
public void onSuccess(List<Object> list) {
//Do what you need to do with your list
}
});
如您所見,當覆寫“onSuccess()”方法時,結果是一個物件串列。最后,只需將串列中的每個物件映射到 Post 型別的物件,并將新串列傳遞給單個配接器。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/346698.html
上一篇:ReactNative-FirebaseError:Firebase:NoFirebaseApp'[DEFAULT]'hasbeencreated
