适配器上的getItemCount()返回0

时间:2016-06-21 06:59:19

标签: android firebase android-adapter firebase-realtime-database firebaseui

我创建了一个工作正常的适配器。现在,我需要计算适配器中的数据项的数量。我正在使用函数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();

可能是什么问题?

3 个答案:

答案 0 :(得分:4)

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

要知道适配器中的数据何时发生变化,您可以注册AdapterDataObserver。例如,在我们的Zero to App talk at I/O中,我们使用了this snippet来确保最新的聊天消息始终可见:

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

我强烈建议您查看full code for that minimal app

答案 1 :(得分:0)

请检查你的getItemCountMethod并将其引用到你在Adapter中使用的列表大小

   @Override
public int getItemCount() {
    return list.size();
}

答案 2 :(得分:0)

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

由于您已经在使用Firebase数据库,因此可以通过直接检查数据库列表是否为空来处理此问题。您可以将其作为实时快照侦听器或简单的get查询(用于一次性读取)来进行。例如,在“活动”或“片段”中(如果您使用的是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
            }
        }
    });