У меня есть следующая конфигурация базы данных: введите описание изображения здесь
коллекция сообщений -> postID -> здесь другая коллекция под названием LikesNumber -> документ currentLikesNumber -> поле 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
от High до Low. Моя проблема в том, что я не знаю, как получить доступ к данным в 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 и обновить их с наибольших числовых значений до наименьших (порядок убывания).