仅使用包含与特定键列表匹配的键的项目填充Firebase RecyclerView?

时间:2017-06-28 01:31:36

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

为了简化我的问题:我有一个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上的数据库中的其他项留下空白空间,因为它创建了空列表项但是不会将任何数据绑定到它。我显然不希望差距/空白空间显示不需要的项目。如何调整列表适配器/视图持有者以仅显示所需的项目?

2 个答案:

答案 0 :(得分:1)

您可以通过将其高度设置为0或setting their visibility to gone来完全隐藏您不想显示的项目。但这听起来像是一个可怕的kludge,因为你在这种情况下下载不需要的数据。

这里有两个选项:

  1. 将要显示的项目的键存储在数据库中(structure known as an index, similar to the one described in the Firebase documentation中),然后使用FirebaseIndexedRecyclerAdapter
  2. 创建自己的loads each individual item with a ValueEventListener as described in the Firebase documentation
  3. 适配器

答案 1 :(得分:1)

您没有在代码中发布您正在使用的查询,因此我假设DatabaseReference位于/businesses下面的所有内容的populateView()。如果您正在执行此操作,那么您将为该位置的每个孩子拨打view方法。这意味着您将被要求为每个孩子制作if statement。您无法选择是否为该项目显示视图。

您似乎认为populateView中的businessList会跳过那些不属于您equalTo()的项目。但实际发生的是,您只是允许空视图占据列表中的那个位置。

相反,您应该提出一个查询,该查询仅生成列表中感兴趣的项目。这意味着您必须告诉Firebase过滤符合条件的子项。您可以使用Adapter方法来实现此目的。

另一种解决方案是,阅读该位置的全部内容,手动过滤掉您不想要的项目,并构建您想要的项目列表。您可以使用该列表构建{{1}},然后它可以成为RecyclerView的输入。

希望它有所帮助。