Как отобразить диалоговое окно прогресса, пока данные не загрузятся в FirestoreRecyclerAdapter - PullRequest
0 голосов
/ 01 марта 2020

Я использую FirestoreRecyclerAdapter для загрузки данных из Firestore в RecyclerView. Я хотел бы показать диалог прогресса, пока данные не загрузятся полностью. Как я могу это сделать? Заранее спасибо.

Вот мой код.

void loadPosts() {
    FirestoreRecyclerOptions<Post> options = new FirestoreRecyclerOptions.Builder<Post>()
            .setQuery(query, Post.class)
            .build();

    adapter = new FirestoreRecyclerAdapter<Post, DataViewHolder>(options) {
        @Override
        protected void onBindViewHolder(@NonNull DataViewHolder dataViewHolder, int i, @NonNull Post post) {
            dataViewHolder.setData(post.getTitle(), post.getDescription());
        }

        @NonNull
        @Override
        public DataViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_post, parent, false);
            return new DataViewHolder(view);
        }
    };
    recyclerView.setAdapter(adapter);
    adapter.startListening();
}

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

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

Ответы [ 2 ]

1 голос
/ 01 марта 2020

Хотя ответ Гастона работает, есть немного более простой способ, который не требует дополнительного слушателя. У FirestoreRecyclerAdapter есть метод, который сигнализирует, когда он получил полный QuerySnapshot.

void loadPosts() {
    FirestoreRecyclerOptions<Post> options = new FirestoreRecyclerOptions.Builder<Post>()
            .setQuery(query, Post.class)
            .build();

    progressDialog.show();

    adapter = new FirestoreRecyclerAdapter<Post, DataViewHolder>(options) {
        @Override
        public void onDataChanged() {
            progressDialog.hide();
        }

        @Override
        protected void onBindViewHolder(@NonNull DataViewHolder dataViewHolder, int i, @NonNull Post post) {
            dataViewHolder.setData(post.getTitle(), post.getDescription());
        }

        @NonNull
        @Override
        public DataViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.single_post, parent, false);
            return new DataViewHolder(view);
        }
    };
    recyclerView.setAdapter(adapter);
    adapter.startListening();
}

Также см. Документацию FirebaseUI по FirestoreRecyclerAdapter данным и событиям ошибок .

Обратите внимание, что onDataChanged может вызываться несколько раз, сначала один раз, а затем каждый раз, когда изменяются данные для query. Поэтому убедитесь, что код там может обрабатывать вызовы несколько раз. Например: если вы уничтожите диалоговое окно прогресса в onDataChanged вместо того, чтобы скрыть его, вы также захотите проверить его существование.

1 голос
/ 01 марта 2020

До .setQuery(query) в вашем FirebaseRecyclerAdapter компоновщике вы можете прикрепить слушатель к этому запросу, чтобы знать, когда он завершился, чтобы построить RecyclerView

Пример

    progressDialog.show();
    Query query = db.collection("Users").child(my_user_id).addListenerForSingleValue(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot) {
        //Data has been fetched, hide progressDialog , check if data exists at the location with if(dataSnapshot.exists()) if you want to be sure theres something to fetch
        progressDialog.hide();
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {
        //The fetch failed, dismiss the dialog and show an error message
        progressDialog.hide();
      }
    });

Проверьте методы Запрос

...