我具有以下数据库配置: enter image description here
收藏集-> postID->在这里另一个名为LikesNumber-> document currentLikesNumber-> field currentNoOfLikes的收藏集
在我的应用程序中,我想根据某些功能对帖子进行排序。我已经实现了按帖子类别排序的代码,它是这样的:
public void getHorror(){
blog_list = new ArrayList<>();
blogRecyclerAdapter = new BlogRecyclerAdapter(blog_list);
blog_list_view.setLayoutManager(new LinearLayoutManager(getActivity()));
blog_list_view.setAdapter(blogRecyclerAdapter);
blog_list_view.setHasFixedSize(true);
firebaseAuth = FirebaseAuth.getInstance();
if(firebaseAuth.getCurrentUser() != null) {
firebaseFirestore = FirebaseFirestore.getInstance();
blog_list_view.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
Boolean reachedBottom = !recyclerView.canScrollVertically(1); //if we reach bottom
if(reachedBottom){
loadMore();
}
}
});
Query firstQuery = firebaseFirestore.collection("Posts").whereEqualTo("category","Horror").orderBy("timestamp", Query.Direction.DESCENDING); //show newest posts first
firstQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
if (e == null) {
if (!queryDocumentSnapshots.isEmpty()) {
if (isFirstPageLoaded) {
lastVisible = queryDocumentSnapshots.getDocuments().get(queryDocumentSnapshots.size() - 1);
blog_list.clear();
}
for (DocumentChange doc : queryDocumentSnapshots.getDocumentChanges()) {
if (doc.getType() == DocumentChange.Type.ADDED) {
String blogPostId = doc.getDocument().getId();
BlogPost blogPost = doc.getDocument().toObject(BlogPost.class).withId(blogPostId);
if (isFirstPageLoaded) {
blog_list.add(blogPost);
} else {
blog_list.add(0, blogPost);
}
blogRecyclerAdapter.notifyDataSetChanged();
}
}
isFirstPageLoaded = false;
}
}
}
});
}
blog_list.clear();
blogRecyclerAdapter.notifyDataSetChanged();
}
基本上,当类别字段中包含给定的字符串时,我的回收站适配器将仅显示那些特定帖子。
现在,我想做同样的事情,但是我想按currentNoOfLikes
从高到低对它们进行排序。我的问题是我不知道如何在currentNoOfLikes中访问数据。这就是我尝试过的
public void getLikesHL(){
blog_list = new ArrayList<>();
blogRecyclerAdapter = new BlogRecyclerAdapter(blog_list);
blog_list_view.setLayoutManager(new LinearLayoutManager(getActivity()));
blog_list_view.setAdapter(blogRecyclerAdapter);
blog_list_view.setHasFixedSize(true);
firebaseAuth = FirebaseAuth.getInstance();
if(firebaseAuth.getCurrentUser() != null) {
firebaseFirestore = FirebaseFirestore.getInstance();
blog_list_view.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
Boolean reachedBottom = !recyclerView.canScrollVertically(1); //if we reach bottom
if(reachedBottom){
loadMore();
}
}
});
Query firstQuery = firebaseFirestore.collection("LikesNumber").orderBy("currentNoOfLikes",Query.Direction.DESCENDING); //show newest posts first
firstQuery.addSnapshotListener(new EventListener<QuerySnapshot>() {
@Override
public void onEvent(QuerySnapshot queryDocumentSnapshots, FirebaseFirestoreException e) {
if (e == null) {
if (!queryDocumentSnapshots.isEmpty()) {
if (isFirstPageLoaded) {
lastVisible = queryDocumentSnapshots.getDocuments().get(queryDocumentSnapshots.size() - 1);
blog_list.clear();
}
for (DocumentChange doc : queryDocumentSnapshots.getDocumentChanges()) {
if (doc.getType() == DocumentChange.Type.ADDED) {
String blogPostId = doc.getDocument().getId();
BlogPost blogPost = doc.getDocument().toObject(BlogPost.class).withId(blogPostId);
if (isFirstPageLoaded) {
blog_list.add(blogPost);
} else {
blog_list.add(0, blogPost);
}
blogRecyclerAdapter.notifyDataSetChanged();
}
}
isFirstPageLoaded = false;
}
}
}
});
}
blog_list.clear();
blogRecyclerAdapter.notifyDataSetChanged();
}
但是,当回收站适配器更新时,它为空。出于某种原因,我无法从currentNoOfLikes获取数据并将其从最高数值更新为最低数值(降序)。
答案 0 :(得分:1)
更改此:
Query firstQuery = firebaseFirestore.collection("LikesNumber").orderBy("currentNoOfLikes",Query.Direction.DESCENDING); //show newest posts first
对此:
firebaseFirestore = FirebaseFirestore.getInstance();
Query firstQuery = firebaseFirestore.collection("Posts").document(postID).collection("LikesNumber").orderBy("currentNoOfLikes",Query.Direction.DESCENDING);
集合LikesNumber
是一个子集合,因此要访问它,您需要通过Posts-> postsID-> LikesNumber然后可以获取数据。