【问题标题】:getItemCount() on Adapter is returning 0适配器上的 getItemCount() 返回 0
【发布时间】:2016-10-22 14:14:03
【问题描述】:

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

可能是什么问题?

【问题讨论】:

  • 您在哪里将列表设置为适配器 .??我能知道什么是 mPost ..??
  • @Moinkhan 我已经编辑了这个问题。请看一看。
  • 嘿!我正在关注一个教程,他们使用某个版本的领域。当我尝试应用他们所做的一切时,我的 getItemCount() 返回零。我发现这是由于领域的版本。所以也许你需要检查一下。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    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

    【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • getItemCount() 是一个内置函数。
    • 另外,如果我实现这个方法,应该写什么来代替list?
    • 您需要覆盖它并代替 list 添加您用于在适配器中显示的数组列表
    • 可能是一个简单的数组,然后试试 .length ?
    • 在哪里设置列表??在你的适配器中??
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多