2014-11-10 3 views
0

Так я использую AutoCompleteTextView (позже будет меняющимся это к EditText, но одна проблемы в то время), чтобы отфильтровать результаты моей ListView реализации textWatcher:сброс lisview после фильтрации

fqp = new FilterQueryProvider() { 
      @Override 
      public Cursor runQuery(CharSequence constraint) { 
       String itemName = constraint.toString(); 
       return getSearch(itemName); 
      } 
     }; 

Cursor getSearch(String itemName) { 
     String searchSelect = "(" + MediaStore.Audio.Media.TITLE + " LIKE ?)"; 
     String[] selectArgs = { "%" + itemName + "%"}; 
     Cursor searchCursor = getContentResolver().query(
       queryUri, 
       projection, 
       searchSelect, 
       selectArgs, 
       MediaStore.Audio.Media.TITLE + " ASC" 
     ); 
     return searchCursor; 
    } 

public void onTextChanged(CharSequence s, int start, int before, 
           int count) { 
     String empty = ""; 
     if(s.toString() == empty){ 
      adapter.changeCursor(getAll()); 
      adapter.notifyDataSetChanged(); 
     }else{ 
      adapter.getFilter().filter(s.toString()); 
      adapter.notifyDataSetChanged(); 
     } 
    } 

Этот фильтр работает просто отлично, но мне нужно выяснить способ сброса моего списка, когда мой autoCompleteTextView пуст. Конечно, есть правильный способ сделать это, кроме тестирования, если он пуст, но это то, что я пытался сделать безрезультатно. Также я должен просто создать два курсора: один из которых содержит мой полный список, а другой - отфильтрованный список, поэтому мне не нужно повторно запрашивать контент-провайдера?

+0

's.toString() == empty'. нет. Используйте либо 'equals', либо' TextUtils.isEmpty (s) ' – njzk2

ответ

1

Проблема, кажется, лежит в этой линии

if(s.toString() == empty) 

В Java, вы не можете сравнивать строки, как это, вам нужно использовать

if(s.toString().equals(empty)) 

Также TextWatcher не вызывался, потому что слушатель не связан с вашим автозаполнением.


Также я должен просто создать два курсоров: один, содержащий мой полный список, а другой мой отфильтрованный список, поэтому я не придется повторно запрос поставщика контента?

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

Пример использования EditText:

adapter.setFilterQueryProvider(fqp); 
search.addTextChangedListener(watch); 

fqp = new FilterQueryProvider() { 
    @Override 
    public Cursor runQuery(CharSequence constraint) { 
     String itemName = constraint.toString(); 
     return getSearch(itemName); 
    } 
}; 

Cursor cursor = getContentResolver().query(
    queryUri, 
    projection, 
    null, 
    null, 
    MediaStore.Audio.Media.TITLE+" ASC" 
); 

Cursor getSearch(String itemName) { 
    String searchSelect = "(" + MediaStore.Audio.Media.TITLE + " LIKE ?)"; 
    String[] selectArgs = { "%" + itemName + "%"}; 
    Cursor searchCursor = getContentResolver().query(
     queryUri, 
     projection, 
     searchSelect, 
     selectArgs, 
     MediaStore.Audio.Media.TITLE + " ASC" 
    ); 
    return searchCursor; 
} 

TextWatcher watch = new TextWatcher() { 
    @Override 
    public void onTextChanged(CharSequence s, int start, int before, 
           int count) { 
     String empty = ""; 
     if (s.toString().equals(empty)) { 
      adapter.changeCursor(cursor); 
      adapter.notifyDataSetChanged(); 
     } else { 
      adapter.getFilter().filter(s.toString()); 
      adapter.notifyDataSetChanged(); 
     } 
    } 

    @Override 
    public void beforeTextChanged(CharSequence s, int start, 
            int count, int after) { 
    } 

    @Override 
    public void afterTextChanged(Editable s) { 

    } 
}; 
+0

Спасибо за ответ, я подумал об этом после публикации и опробовал его, но он все еще не работает. Также я думал, что это может быть потому, что textwatcher только вызывает onTextChanged после ввода определенного количества символов. Поэтому я попытался проверить, есть ли ввод четырех пробелов, а затем сброс, но он все еще не работает. Мне кажется, что в текстовом наблюдателе должен быть метод, который знает, когда я удаляю свой ввод или меняю фокус. Наверняка есть лучший способ реализовать это? – spintron

+0

Является ли onTextChanged даже названным? Вы установили его как слушателя TextView? –

+0

Хм подумать, что это может быть. возможно, мой autoCompleteTextView просто вызывает его поставщика фильтра по умолчанию и не получает доступ к моему onTextChangeed. Поэтому я изменил его с autoCompleteTextView на EditText, и я пытаюсь выполнить search.addTextChangedListener(), но если я внедряю TextWatcher как часть моего класса, что я помещаю внутри()? – spintron

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