使用firebaserecycleradapter过滤recyclelerview

时间:2015-12-20 16:06:17

标签: android firebase firebase-realtime-database

我有一个带有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个编辑距离的结果。

还有一种忽略查询的方法吗?

1 个答案:

答案 0 :(得分:3)

我刚刚完成了你正在寻找的东西,我不确定它是最优雅的解决方案,但我会抛出一些想法,如果你认为我的想法会有所帮助,我绝对可以提供一些例子

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

快速:

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

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

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

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

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

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

使用此方法,您只需使用:

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

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

adapter.getFilter().filter("")

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