我创建了一个工作正常的适配器。现在,我需要计算适配器中的数据项的数量。我正在使用函数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();
可能是什么问题?
答案 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
}
}
});