Как @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
при прокрутке пользователя.