【问题标题】:Populate Firebase RecyclerView only with items with keys that match a particular list of keys?仅使用具有与特定键列表匹配的键的项目填充 Firebase RecyclerView?
【发布时间】:2017-06-28 01:31:36
【问题描述】:

为了简化我的问题:我有一个 Firebase 数据库,它有一个“企业”节点,而企业节点的子节点具有 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 上的其他项目留下一个空白空间,因为它创建了空列表项,但不绑定任何数据。我显然不希望间隙/空白空间显示不需要的项目。如何调整我的列表适配器/视图支架以仅显示所需的项目?

【问题讨论】:

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


    【解决方案1】:

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

    你有两个选择:

    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

    【讨论】:

      【解决方案2】:

      您没有发布您在代码中使用的查询,所以我假设它只是DatabaseReference 用于/businesses 下方的所有内容。如果您这样做,您将收到对该位置的每个孩子的populateView() 方法的调用。这意味着您将被要求为每个孩子制作一个view。您无法选择是否会为该项目显示视图。

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

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

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

      希望对你有帮助。

      【讨论】:

        猜你喜欢
        • 2020-10-02
        • 2021-09-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-05-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多