Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/firebase/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 是否仅使用键与特定键列表匹配的项填充Firebase RecyclerView?_Android_Firebase_Firebase Realtime Database_Android Recyclerview_Firebaseui - Fatal编程技术网

Android 是否仅使用键与特定键列表匹配的项填充Firebase RecyclerView?

Android 是否仅使用键与特定键列表匹配的项填充Firebase RecyclerView?,android,firebase,firebase-realtime-database,android-recyclerview,firebaseui,Android,Firebase,Firebase Realtime Database,Android Recyclerview,Firebaseui,为了简化我的问题:我有一个Firebase数据库,它有一个“业务”节点,业务节点有子节点,该子节点具有ID和有关该特定业务的相应数据。我不想在firebase Recycler视图中显示所有业务,只显示某些业务。对于我想在任何给定时间显示的ID,我有一个ID列表 ... List<String> businessList = ("00002", "00004", "00021"); ... private void setUpFirebaseAdapter() { mF

为了简化我的问题:我有一个Firebase数据库,它有一个“业务”节点,业务节点有子节点,该子节点具有ID和有关该特定业务的相应数据。我不想在firebase Recycler视图中显示所有业务,只显示某些业务。对于我想在任何给定时间显示的ID,我有一个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);
} 
。。。
列表业务列表=(“00002”、“00004”、“00021”);
...
私有void setUpFirebaseAdapter(){
mFirebaseAdapter=新的FirebaseRecyclerAdapter
(User.class、R.layout.business\u list\u项目、FirebaseBusinessViewHolder.class、mBusinessReference{
@凌驾
受保护的void populateViewHolder(FirebaseBusinessViewHolder viewHolder,用户模型,int位置){
for(字符串businessID:businessList){
if(businessID.equals(model.getId())){
//显示此项目
viewHolder.bindBusiness(model,true);
}
如果(!businessID.equals(model.getId())){
//不显示此项目
}
}
}
};
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setLayoutManager(新的LinearLayoutManager(this));
mRecyclerView.setAdapter(mFirebaseAdapter);
} 

如果我运行此代码,它将只显示businessList中的数据,但它也会为数据库中存储的ID不在businessList中的其他项目留下一个空白,因为它创建了空白列表项目,但没有将任何数据绑定到该项目。我显然不希望显示不需要的项目的间隙/空白。如何调整我的列出适配器/视图支架以仅显示所需的项目?

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

这里有两个选项:

  • 将要显示在数据库中的项目的键存储在(a)中,然后使用
  • 创建您自己的适配器

  • 您没有发布您在代码中使用的查询,因此我假设它只是
    数据库参考
    ,用于
    /business
    下的所有内容。如果您这样做,您将得到一个调用
    populateView()
    方法,用于该位置的每个孩子。这意味着您将被要求为每个孩子创建一个
    视图
    。您无法选择是否为该项目显示一个视图

    看起来您假设
    populateView
    中的
    if语句将跳过那些不属于
    businessList
    的项目。但实际情况是,您只是允许一个空视图占据列表中的位置

    相反,您应该提出一个只生成列表中感兴趣的项目的查询。这意味着您必须告诉Firebase筛选符合您条件的子项。您可以使用
    equalTo()
    方法来实现这一点

    另一个解决方案是,读取位置的全部内容,手动筛选出您不想要的项目,并构建一个您想要的项目列表。您可以使用该列表构建一个
    适配器,然后它可以成为RecyclerView的输入

    希望能有帮助