为了简化我的问题:我有一个Firebase数据库,该数据库有一个“business”节点,而business节点有子ID,并且有关于该特定业务的相应数据。我不想在我的firebase Recycler View中显示所有业务,只显示某些业务。对于我想在任何给定时间显示的那些,我有一个ID列表。
...
List<String> businessList = ("00002", "00004", "00021");
...
private void setUpFirebaseAdapter() {
mFirebaseAdapter = new FirebaseRecyclerAdapter<User, FirebaseBusinessViewHolder>
(User.class, R.layout.business_list_item, FirebaseBusinessViewHolder.class, mBusinessReference{
@Override
protected void populateViewHolder(FirebaseBusinessViewHolder viewHolder, User model, int position){
for (String businessID : businessList) {
if (businessID.equals(model.getId())){
//show this item
viewHolder.bindBusiness(model, true);
}
if(!businessID.equals(model.getId())){
//don't show this item
}
}
}
};
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
mRecyclerView.setAdapter(mFirebaseAdapter);
}
如果我运行此代码,它将只显示来自businessList的数据,但它也为存储在其ID不在businessList上的数据库中的其他项留下空白空间,因为它创建了空列表项但是不会将任何数据绑定到它。我显然不希望差距/空白空间显示不需要的项目。如何调整列表适配器/视图持有者以仅显示所需的项目?
答案 0 :(得分:1)
您可以通过将其高度设置为0或setting their visibility to gone来完全隐藏您不想显示的项目。但这听起来像是一个可怕的kludge,因为你在这种情况下下载不需要的数据。
这里有两个选项:
答案 1 :(得分:1)
您没有在代码中发布您正在使用的查询,因此我假设DatabaseReference
位于/businesses
下面的所有内容的populateView()
。如果您正在执行此操作,那么您将为该位置的每个孩子拨打view
方法。这意味着您将被要求为每个孩子制作if statement
。您无法选择是否为该项目显示视图。
您似乎认为populateView
中的businessList
会跳过那些不属于您equalTo()
的项目。但实际发生的是,您只是允许空视图占据列表中的那个位置。
相反,您应该提出一个查询,该查询仅生成列表中感兴趣的项目。这意味着您必须告诉Firebase过滤符合条件的子项。您可以使用Adapter
方法来实现此目的。
另一种解决方案是,阅读该位置的全部内容,手动过滤掉您不想要的项目,并构建您想要的项目列表。您可以使用该列表构建{{1}},然后它可以成为RecyclerView的输入。
希望它有所帮助。