Как отображать данные из Firestore в RecyclerView с Android?

Каков наилучший способ отображения данных из существующей базы данных Firestore в RecyclerView с помощью Android?

Это не рассматривается как полное объяснение в ответе, поэтому я добавил этот Q & A-стиль, чтобы его можно было связать с комментариями.

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

 Firestore-root | --- products (collection) | --- documentIdOne (document) | | | --- productName: "Milk" | --- documentIdTwo (document) | | | --- productName: "Soy Milk" | --- documentIdThree (document) | --- productName: "Bacon" 

Модельный class выглядит так:

 public class ProductModel { private String productName; public ProductModel() {} public ProductModel(String productName) {this.productName = productName;} public String getProductName() {return productName;} } 

И файл .XML , содержащий RecyclerView который также выглядит так:

  

Чтобы отобразить все названия продуктов, выполните следующие действия.

Во-первых, вам нужно найти RecyclerView в своей деятельности и установить LinearLayoutManager следующим образом:

 RecyclerView recyclerView = findViewById(R.id.recycler_view); recyclerView.setLayoutManager(new LinearLayoutManager(this)); 

Затем вам нужно создать корневую ссылку вашей базы данных Firestore и объект Query следующим образом:

 FirebaseFirestore rootRef = FirebaseFirestore.getInstance(); Query query = rootRef.collection("products") .orderBy("productName", Query.Direction.ASCENDING); 

Затем вам нужно будет создать объект FirestoreRecyclerOptions следующим образом:

 FirestoreRecyclerOptions options = new FirestoreRecyclerOptions.Builder() .setQuery(query, ProductModel.class) .build(); 

В своем classе активности создайте class holder который выглядит так:

 private class ProductViewHolder extends RecyclerView.ViewHolder { private View view; ProductViewHolder(View itemView) { super(itemView); view = itemView; } void setProductName(String productName) { TextView textView = view.findViewById(R.id.text_view); textView.setText(productName); } } 

Затем создайте adapter объявленный как глобальный:

 private FirestoreRecyclerAdapter adapter; 

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

 adapter = new FirestoreRecyclerAdapter(options) { @Override protected void onBindViewHolder(@NonNull holder productViewHolder, int position, @NonNull ProductModel productModel) { holder.setProductName(productModel.getProductName()); } @NonNull @Override public ProductViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_product, parent, false); return new ProductViewHolder(view); } }; recyclerView.setAdapter(adapter); 

В конце концов, не забудьте переопределить следующие два метода и начать прослушивание изменений:

 @Override protected void onStart() { super.onStart(); adapter.startListening(); } @Override protected void onStop() { super.onStop(); if (adapter != null) { adapter.stopListening(); } } 

В результате получается следующее:

введите описание изображения здесь

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

Если вы хотите отображать сообщение тоста, когда пользователь нажимает на элемент, добавьте следующие строки кода внутри setProductName() из classа ProductViewHolder :

 textView.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { Toast.makeText(getApplicationContext(), productName, Toast.LENGTH_SHORT).show(); } }); 
  • Картинка для Android на стене Facebook
  • java.io.IOException: обнаружено не было
  • Java - чтение файла и разбиение на несколько файлов
  • Ошибка: Не удалось запустить SDK-инструмент mksdcard
  • Как выполнить итерацию свойств id classа R.java?
  • Преобразование строки в массив JSON
  • Может ли Android SDK работать с JDK 1.7?
  • Загрузка ресурса из любого места в пути classpath
  • Создание с помощью каталога Intellij 2017.2 / out дублирует файлы в каталоге / build
  • Android java.lang.VerifyError?
  • Поиск в Android с помощью fragmentов
  • Interesting Posts

    Как реализовать в Java (class JTextField), чтобы разрешить вводить только цифры?

    Почему невозможно, не пытаясь выполнить ввод-вывод, обнаружить, что TCP-сокет был изящно закрыт одноранговым узлом?

    Измените коллекцию маршрутов MVC6 после запуска

    Как создать псевдоним Bash?

    Windows 8 показывает оранжевый экран с белыми полосками при загрузке

    Как создать гетерогенную коллекцию объектов?

    Batch – время последнего изменения файла с секундами

    WPF ListView: привязка события двойного щелчка (по элементу)

    Каково значение url-шаблона в web.xml и как настроить сервлет?

    android как создать свою собственную деятельность и расширить ее?

    AVFoundation + AssetWriter: создайте фильм с изображениями и аудио

    Центрировать колонку с помощью Twitter Bootstrap

    Ошибка Android Studio Gradle: несколько файлов dex определяют

    Использование свойств Scala с реализованными методами в Java

    Копирование файла только в том случае, если оно новее, чем место назначения

    Давайте будем гением компьютера.