1

Я создал представление списка в андроиде, и я уже реализовать фильтр поиска с помощью SearchView и CharSequence в качестве параметра, как этогоListView фильтр adapter.getFilter(). Фильтр (более одного значения)

searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       return false; 
      } 

      @Override 
      public boolean onQueryTextChange(String query) { 
       adapter.getFilter().filter(query); 
       return false; 
      } 
     }); 

сейчас как я могу получить результат фильтра более чем одним значением? adapter.getFilter().filter("example" || "example" || example); можно ли это сделать? или, может быть, я могу использовать filter.getFilter(). filter (array здесь)?

EDIT: это мой фильтр

public class CustomFilter extends Filter { 

    List<Event> filterList; 
    EventAdapter adapter; 

    public CustomFilter(List<Event> filterList, EventAdapter adapter) { 
     this.filterList = filterList; 
     this.adapter = adapter; 
    } 

    //FILTERING 
    @Override 
    protected FilterResults performFiltering(CharSequence constraint) { 

     //RESULTS 
     FilterResults results=new FilterResults(); 

     //VALIDATION 
     if(constraint != null && constraint.length()>0) 
     { 

      //CHANGE TO UPPER FOR CONSISTENCY 
      constraint=constraint.toString().toUpperCase(); 

      ArrayList<Event> filteredEvent=new ArrayList<>(); 

      //LOOP THRU FILTER LIST 
      for(int i=0;i<filterList.size();i++) 
      { 
       //FILTER (tinggal mainin logic aja mau filter berdasarkan apa nya) 
       if(filterList.get(i).getJudul().toUpperCase().contains(constraint)|| filterList.get(i).getDeskripsi().toUpperCase().contains(constraint)) 
       { 
        filteredEvent.add(filterList.get(i)); 
       } 
      } 

      results.count=filteredEvent.size(); 
      results.values=filteredEvent; 
     }else 
     { 
      results.count=filterList.size(); 
      results.values=filterList; 
     } 

     return results; 
    } 


    //PUBLISH RESULTS 

    @Override 
    protected void publishResults(CharSequence constraint, FilterResults results) { 

     adapter.eventes= (List<Event>) results.values; 
     adapter.notifyDataSetChanged(); 

    } 
} 

ответ

0

Вы не можете изменить API рамочного класса. В классе Filter нет метода, который принимает несколько аргументов ограничения. Если вы хотите продолжать использовать Filter, вы можете комбинировать только свои аргументы, чтобы их можно было разделить снова внутри метода filter(), например. путем объединения их в разделенную запятыми строку и затем разделение строки.

В качестве альтернативы, вам не нужно использовать класс Filter, вы можете создать свой собственный класс, который может принимать (например) List<String>, и выполняет ли фильтрацию, а затем задает отфильтрованные результаты в вашем адаптере. Единственная трудная часть - теперь вы должны справиться с логикой для выполнения этой работы в фоновом режиме, отменив работу, если происходит другой звонок фильтра, когда он выполняется, и т. Д.

+0

ya Я это понимаю, есть ли у вас какие-либо сведения об этом случае? или любой учебник, который может помочь мне его создать? –

+0

@PhilipusSilaen нет, но это может быть так же просто, как использование 'String.join()' и 'String.split()' – Karakuri

3

Вы можете проверить мою ссылку на свой вопрос.

Я реализую это с помощью одного String, который включает значения для двух разных фильтров и добавляет разделительную метку (в данном случае: «-») между двумя значениями в String.

MainActivity.class

  String lat = latitude.getText().toString(); 
      String lon = longitude.getText().toString(); 
      //join the two strings and add a split mark '-' 
      String join = lat + "-" + lon; 

      mca.getFilter().filter(join); //mca is my cursorAdapter 
      mca.notifyDataSetChanged(); 

      mca.setFilterQueryProvider(new FilterQueryProvider() { 
       @Override 
       public Cursor runQuery(CharSequence constraint) { 
        String value = constraint.toString(); 
        return getFilterResults(value); 
       } 

      }); 

getFilterResult (String filterValue)

public Cursor getFilterResults(String filterValue) { 

    Cursor c = getLoactionTimeEntry(); //some default init 
    String lat = ""; 
    String lon = ""; 
    String[] splitFilterValue = filterValue.split("-"); 

    if(filterValue.charAt(0) == '-') { 
     lon = splitFilterValue[1]; 
     c = getLongitudeFilter(lon); 
    } 
    else if(splitFilterValue.length == 2) { 
     lat = splitFilterValue[0]; 
     lon = splitFilterValue[1]; 
     c = getLongtitudeLatitudeFilter(lat,lon); 
    } 
    else { 
     lat = splitFilterValue[0]; 
     c = getLatitudeFilter(lat); 
    } 

    return c; 
} 

в моем методе фильтров я расколоть String с функцией split() и хранить значения обратно, чтобы отделить переменные строки. Функции: getLongitudeFilter(lon), getLongtitudeLatitudeFilter(lat,lon), getLatitudeFilter(lat) - это мои функции, которые возвращают Cursor, чтобы получить то, что мне нужно от DataBase в этом случае.

+0

Я уже разместил свой фильтр. Я понимаю, что вы предлагаете, но как я могу реализовать его в своем коде? вы можете помочь мне, пожалуйста, может быть? Я действительно застрял в этом. –

+0

Можете ли вы помочь мне @ShaharMedina или кому-то еще? Мне так нужно для моей задачи колледжа –

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