2015-12-20 2 views
4

У меня есть RecyclerView с FirebaseRecyclerAdapter. Я хочу заполнить RecyclerView списком имен, когда пользователь начнет вводить текст в SearchView.Фильтрация recyclerview с firebaserecycleradapter

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); 
     } 
    } 
} 

Я предполагаю, что мне нужно добавить QueryTextListener к SearchView, что бы обновить запрос в адаптере. Разве это сломает FirebaseRecyclerAdapter?

Или я должен

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

всякий раз, когда пользователь вводит что-то?

Кроме того, в документах говорится о заказе и сортировке запросов с использованием firebase, но явно не говорят, что лучший способ выполнить сопоставление строк. Каков наилучший способ выполнить сопоставление строк, чтобы представление recycler отображало все результаты, которые имеют поисковый запрос в качестве подстроки записи базы данных, и, возможно, те, которые также находятся на расстоянии редактирования.

Также можно игнорировать запросы?

ответ

3

Я только что закончил делать что-то рядом с тем, что вы ищете, я не уверен, что это самое элегантное решение, но я вышлю некоторые идеи, и если вы думаете, что моя идея поможет, я могу определенно предоставить некоторые Примеры.

Во-первых, когда я расширил базовый FirebaseAdapter, я добавил новый фильтр с именем mFullList, так как mItems FirebaseAdapter будут использоваться для отображения списка, я не хочу продолжать возвращаться в сеть, когда не сделал должен. Затем я переопределяю все методы моего дочернего класса, чтобы обновить mFullList значениями из обратных вызовов Firebase, отсортировать их, фильтровать, а затем вызвать super.X() с новым списком.

Быстро:.

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

filterString это поле внутри адаптера и обновляется во время вызова getFilter (фильтр)(). Во время выполнения фильтра я затем цикл через mFullList и сделать сравнение из:

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

После fitlering делается у вас есть новый список, который передается Filter.publishResults в объекте FilterResults. publishResults вызывает метод в классе, который выполняет обновление и уведомляет.

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

По сути, я не хочу, чтобы FirebaseAdapater прекратить получать полный список предметов, я просто хотел, чтобы пользователи запрашивают фильтровать этот список и обработать их запрос соответствующим образом. Кроме того, я не видел смысла в добавленных сетевых запросах, на которых пользователь вводил дополнительный символ.

Используя этот метод, вы можете просто использовать:

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

фильтровать список, основанный на обновленной области и

adapter.getFilter().filter("") 

сбросить полный список (до тех пор, как ваш performFilter() обработал его правильно. Таким образом, новые обновления из FireBase будут отфильтрованы на основе выбора пользователей, а также когда пользователь будет вводить новые значения, не потребует создания новых сетевых запросов Firebase.

+1

Можете ли вы прояснить этот образец или профиль, спасибо – SimpiMind

Смежные вопросы