【问题标题】:How to show progress dialog until the data loads in FirestoreRecyclerAdapter如何在 FirestoreRecyclerAdapter 中加载数据之前显示进度对话框
【发布时间】:2020-06-13 22:26:33
【问题描述】:

我正在使用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();
    }
}

【问题讨论】:

    标签: android firebase android-recyclerview google-cloud-firestore firebaseui


    【解决方案1】:

    虽然 Gastón 的回答有效,但有一种稍微简单的方法,不需要额外的听众。 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();
    }
    

    另请参阅 FirestoreRecyclerAdapter data and error events 上的 FirebaseUI 文档。

    请注意,onDataChanged 可能会被调用多次,最初一次,然后每次query 的数据更改时。因此,请确保其中的代码可以处理多次调用。例如:如果您销毁onDataChanged 中的进度对话框而不是隐藏它,您还需要检查它是否存在。

    【讨论】:

      【解决方案2】:

      FirebaseRecyclerAdapter 构建器中的 .setQuery(query) 之前,您可以将侦听器附加到该查询以了解它何时完成以构建 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();
            }
          });
      

      查看Query的方法

      【讨论】:

        猜你喜欢
        • 2019-12-01
        • 1970-01-01
        • 1970-01-01
        • 2013-04-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多