Есть ли способ разбить на страницы запросы путем объединения курсоров запросов с помощью FirestoreRecyclerAdapter? - PullRequest
0 голосов
/ 29 мая 2018

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

Query first = ref.orderBy("name", Query.Direction.ASCENDING).limit(10);

Вот так я отображаю данные для моего RecyclerView.

firestoreRecyclerOptions = new FirestoreRecyclerOptions.Builder<ModelClass>().setQuery(query, ModelClass.class).build();
myFirestoreRecyclerAdapter = new MyFirestoreRecyclerAdapter(firestoreRecyclerOptions);
recyclerView.setAdapter(myFirestoreRecyclerAdapter);

Я пытаюсь использовать нумерацию страницкак указано в здесь , и я не могу ее решить.

first.get().addOnSuccessListener(new OnSuccessListener<QuerySnapshot>() {
    @Override
    public void onSuccess(QuerySnapshot documentSnapshots) {
        DocumentSnapshot lastVisible = documentSnapshots.getDocuments().get(documentSnapshots.size() - 1);
        Query second = ref.orderBy("name", Query.Direction.ASCENDING).startAfter(lastVisible).limit(10);
        //Create a firestoreRecyclerOptions and setting the adapter
    }
});

Есть ли способ разбить на страницы запросы путем объединения курсоров запросов с использованием FirestoreRecyclerAdapter?Это вообще возможно?

Ответы [ 2 ]

0 голосов
/ 05 июня 2018

Возможный подход - сохранить кнопки каждого элемента в отдельном узле.

Затем извлечь все ключи из этого узла в список массивов или что-то еще.

Затем на основе вашегономер нумерации страниц выбирает ключи из этого массива List и использует запросы orderByKey и startAt и LimitToFirst, объединенные для создания алгоритма пагинации

0 голосов
/ 30 мая 2018

Как @FrankvanPuffelen уже ответил на ранее ваш вопрос , вы не можете достичь этого, потому что в вашем случае вы должны передать 2 разных запроса (first и second) одному адаптеру,что невозможно с FirestoreRecyclerAdapter.Вы можете использовать первый запрос или второй с одним экземпляром вашего адаптера.

Решение состоит в том, чтобы создать два разных списка, содержащих результаты каждого запроса, и объединить их.Затем вы можете передать полученный список другому адаптеру, скажем, ArrayAdapter, а затем отобразить результаты в ListView или даже лучше в RecyclerView.Проблема в этом случае заключается в том, что вы не сможете использовать функции реального времени, которые предоставляет класс FirestoreRecyclerAdapter, но этот подход решит вашу проблему.

Редактировать:

В соответствии с вашим запросом из раздела комментариев, я дам вам пример того, как разбить запрос на нажатие кнопки самым простым способом, используя ListView и ArrayAdapter.Вы можете достичь того же, используя RecyclerView при прокрутке вниз.Но для простоты предположим, что у нас есть ListView и Button, и мы хотим загружать больше элементов в список при каждом нажатии кнопки.Для этого давайте сначала определим представления:

ListView listView = findViewById(R.id.list_view);
Button button = findViewById(R.id.button);

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

Firestore-root
   |
   --- products (collection)
         |
         --- productId (document)
                |
                --- productName: "Product Name"

И класс модели, который выглядит следующим образом:

public class ProductModel {
    private String productName;

    public ProductModel() {}

    public ProductModel(String productName) {this.productName = productName;}

    public String getProductName() {return productName;}

    @Override
    public String toString() { return productName; }
}

Теперь давайте определим запрос с ограничением, установленным на 3.

FirebaseFirestore rootRef = FirebaseFirestore.getInstance();
CollectionReference productsRef = rootRef.collection("products");
Query firstQuery = productsRef.orderBy("productName", Query.Direction.ASCENDING).limit(3);

Это означает, что при каждом нажатии кнопки мы будем загружать еще 3 элемента.А теперь вот код, который делает магию:

firstQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
    @Override
    public void onComplete(@NonNull Task<QuerySnapshot> task) {
        if (task.isSuccessful()) {
            List<ProductModel> list = new ArrayList<>();
            for (DocumentSnapshot document : task.getResult()) {
                ProductModel productModel = document.toObject(ProductModel.class);
                list.add(productModel);
            }
            ArrayAdapter<ProductModel> arrayAdapter = new ArrayAdapter<>(context, android.R.layout.simple_list_item_1, list);
            listView.setAdapter(arrayAdapter);
            lastVisible = task.getResult().getDocuments().get(task.getResult().size() - 1);

            button.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Query nextQuery = productsRef.orderBy("productName", Query.Direction.ASCENDING).startAfter(lastVisible).limit(3);
                    nextQuery.get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                        @Override
                        public void onComplete(@NonNull Task<QuerySnapshot> t) {
                            if (t.isSuccessful()) {
                                for (DocumentSnapshot d : t.getResult()) {
                                    ProductModel productModel = d.toObject(ProductModel.class);
                                    list.add(productModel);
                                }
                                arrayAdapter.notifyDataSetChanged();
                                lastVisible = t.getResult().getDocuments().get(t.getResult().size() - 1);
                            }
                        }
                    });
                }
            });
        }
    }
});

, в котором lastVisible является DocumentSnapshot объектом, который представляет последний видимый элемент из запроса.В этом случае каждый третий и он объявлен как переменная gloabl:

private DocumentSnapshot lastVisible;

Edit2: Здесь у вас также есть решение о том, как вы можете получитьданные из базы данных Firestore и отображать их небольшими порциями в RecyclerView при прокрутке пользователя.

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