Android Firestore: упорядочить сообщения по значению документа - PullRequest
0 голосов
/ 20 апреля 2020

У меня есть следующая конфигурация базы данных: введите описание изображения здесь

коллекция сообщений -> 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 и обновить их с наибольших числовых значений до наименьших (порядок убывания).

1 Ответ

1 голос
/ 20 апреля 2020

Измените это:

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 является вложенной коллекцией, поэтому для доступа к ней вам необходимо go через сообщения -> postsID -> LikesNumber, тогда вы можете получить данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...