【问题标题】:Filtering a recyclerview with a firebaserecycleradapter使用 firebaserecycleradapter 过滤 recyclerview
【发布时间】:2015-12-20 16:06:17
【问题描述】:

我有一个带有 FirebaseRecyclerAdapter 的 RecyclerView。当用户开始在 SearchView 中输入内容时,我想用名称列表填充 RecyclerView。

public class SchoolsAdapter extends FirebaseRecyclerAdapter<School, SchoolsAdapter.SchoolViewHolder> {

    public SchoolsAdapter(Query ref) {
        super(School.class, R.layout.item_school, SchoolViewHolder.class, ref);
    }

    @Override
    public void populateViewHolder(SchoolViewHolder schoolViewHolder, School school, int position) {
        schoolViewHolder.name.setText(school.getName());
        schoolViewHolder.address.setText(school.getAddress());
    }

    static class SchoolViewHolder extends RecyclerView.ViewHolder {

        public TextView name;
        public TextView address;

        public SchoolViewHolder(View itemView) {
            super(itemView);
            name = (TextView) itemView.findViewById(R.id.school_item_tview_name);
            address = (TextView) itemView.findViewById(R.id.school_item_tview_address);
        }
    }
}

我猜我需要向 searchview 添加一个 QueryTextListener 来更新适配器中的 Query。这会破坏 FirebaseRecyclerAdapter 吗?

还是应该

@Override
public boolean onQueryTextChange(String newText) {
    mRecyclerView.setAdapter(new SchoolAdapter(ref.orderByChild("name").startAt(userQuery).endAt(userQuery+"~")) 
    return false;
}

每当用户键入内容时?

文档还讨论了对 firebase 查询的排序和排序,但没有明确说明进行字符串模式匹配的最佳方法。进行字符串匹配的最佳方法是什么,以便回收器视图显示所有将搜索查询作为数据库记录的子字符串的结果,以及可能还有 1 个编辑距离的结果。

还有一种在查询中忽略大小写的方法?

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    我刚刚完成了一些接近您正在寻找的事情,我不确定这是最优雅的解决方案,但我会提出一些想法,如果您认为我的想法会有所帮助,我绝对可以提供一些示例.

    首先,当我扩展基本 FirebaseAdapter 时,我添加了一个名为 mFullList 的新过滤器,因为 FirebaseAdapter 的 mItems 将用于显示列表,我不想在没有的时候继续回到网络到。然后,我覆盖我的子类中的所有方法,以使用 Firebase 回调中的值更新 mFullList,对它们进行排序,过滤它们,然后使用新列表调用 super.X()。

    快点:

    public reset(List)
       mFullList = List
       Collections.sort(mFullList, Comparator)
       getFilter().filter(filterString)
    

    filterString 是适配器中的一个字段,在调用 getFilter().filter() 期间会更新。在执行过滤器期间,我然后循环遍历 mFullList 并进行比较:

    mFullList.get(pos).getName().toLowerCase().contains(filterString.toLowerCase);
    

    过滤完成后,您将获得一个新列表,该列表将传递给 FilterResults 对象中的 Filter.publishResults。 publishResults 调用类中执行更新和通知的方法。

    filterCompleted(List)
       getItems().clear
       getItems().addAll
       notify
    

    本质上,我不希望 FirebaseAdapater 停止获取完整的项目列表,我只是希望用户请求过滤该完整列表并适当地处理他们的请求。此外,我没有看到基于用户输入额外字符而添加的网络请求的意义。

    使用这种方法你可以使用:

    adapter.getFilter().filter("something")
    

    根据您更新的字段过滤列表,并且

    adapter.getFilter().filter("")
    

    重置完整列表(只要您的 performFilter() 正确处理它。这样,来自 FireBase 的新更新将根据用户选择以及用户输入新值时进行过滤,不需要发出新的 Firebase 网络请求。

    【讨论】:

    • 能否请您把这个更清楚或描述一个样本,谢谢
    猜你喜欢
    • 1970-01-01
    • 2018-06-06
    • 2016-11-20
    • 1970-01-01
    • 2023-03-09
    • 2016-10-29
    • 1970-01-01
    • 2017-05-26
    • 2020-02-07
    相关资源
    最近更新 更多