5

我创建了一个工作正常的适配器。现在,我需要计算适配器中数据项的数量。我正在使用函数 getItemcount() ,但我每次都得到一个 0。另外,我正在使用 Firebase 来处理我的数据库。

  final Firebase mRoot = new Firebase(FIREBASE_URL);
  mPosts= mRoot.child("posts");
  rvPosts.setHasFixedSize(true); //for performance improvement
    rvPosts.setLayoutManager(new LinearLayoutManager(this));    //for vertical list

   postAdapter = new FirebaseRecyclerAdapter<Hello, PostViewHolder>(Hello.class, R.layout.view_hello, PostViewHolder.class, mPosts.orderByChild("postedBy")) {

            @Override
            protected void populateViewHolder(final PostViewHolder postViewHolder, final Hello hello, int i) {
              //do something
         }
        };
        rvPosts.setAdapter(postAdapter);
        int postForSelect = postAdapter.getItemCount();

可能是什么问题?

4

3 回答 3

8

FirebaseRecyclerAdapter数据库中的数据异步同步到您的应用程序。当您打印项目数时,尚未同步任何数据。

要知道适配器中的数据何时更改,您可以注册一个AdapterDataObserver. 例如,在 I/O 的从零到应用的谈话中,我们使用了这个片段来确保最新的聊天消息始终可见:

    adapter.registerAdapterDataObserver(new RecyclerView.AdapterDataObserver() {
        public void onItemRangeInserted(int positionStart, int itemCount) {
            messagesList.smoothScrollToPosition(adapter.getItemCount());
        }
    });

我强烈建议您查看该最小应用程序的完整代码

于 2016-06-21T14:14:59.277 回答
0

我在使用 registerAdapterDataObserver 方法时遇到了问题,因为当我尝试使用它来管理视图时它会导致闪烁。但是,我找到了另一条路径:

由于您已经在使用 Firebase 数据库,因此可以通过直接检查数据库列表是否为空来处理此问题。您可以将其作为实时快照侦听器或简单的 get 查询(用于一次性阅读)。例如,在您的 Activity 或 Fragment 中(如果您使用的是 Firestore):

private CollectionReference myCollectionRef = db.collection("users");

myCollectionRef.addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot value,
                                @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.w(TAG, "Listen failed.", e);
                    return;
                }

            assert value != null;
            if (value.getDocuments().size() > 0) { // List is populated

            } else { // List is empty
                //TODO: YOUR WORK HERE
            }
        }
    });
于 2020-04-06T12:55:02.990 回答
0

请检查您的 getItemCountMethod 并参考您在适配器中使用的列表大小

   @Override
public int getItemCount() {
    return list.size();
}
于 2016-06-21T07:02:44.763 回答