2014-02-16 2 views
0

Я создал свой собственный адаптер, который расширяет класс BaseAdapter. Методы адаптеров реализованы и работают нормально.Android listview adapter не фильтрует

Затем я добавил Implements Filterable к этому классу и реализовать свой метод:

@Override 
public Filter getFilter() { 
    Filter filter = new Filter() { 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      // has the filtered values 
      elements = (ArrayList<DictionaryListElement>) results.values; 
      // notifies the data with new filtered values. Only filtered 
      // values will be shown on the list 
      notifyDataSetChanged(); 
     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      FilterResults results = new FilterResults(); 
      Locale locale = new Locale("KK"); 

      if (mOriginalValues == null) { 
       mOriginalValues = new ArrayList<DictionaryListElement>(elements); // saves                   // mOriginalValues 
      } 

      if (constraint == null || constraint.length() == 0) { 

       /* CONTRACT FOR IMPLEMENTING FILTER : set the Original values to result which will be returned for publishing */ 
       results.count = mOriginalValues.size(); 
       results.values = mOriginalValues; 
      } else { 
       ArrayList<DictionaryListElement> filteredArrayList = new ArrayList<DictionaryListElement>(); 

       String searchword = constraint.toString(); 
       searchword = searchword.toLowerCase(locale); 


       for (int i = 0; i < mOriginalValues.size(); i++) { 
        String word = mOriginalValues.get(i).getWord(); 
        if (word.toLowerCase(locale).startsWith(searchword)) { 
         filteredArrayList.add(mOriginalValues.get(i)); 
        } 
       } 
       // set the Filtered result to return 
       results.count = filteredArrayList.size(); 
       results.values = filteredArrayList; 
      } 

      return results; 
     } 
    }; 

    return filter; 
} 

Затем я добавил SearchView в моей деятельности, и добавил к моей деятельности implements OnQueryTextListener

Затем я добавил этот SearchView в моем меню:

@Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
    // Inflate the menu; this adds items to the action bar if it is present. 
    getMenuInflater().inflate(R.menu.main, menu); 

    search = new SearchView(getActionBar().getThemedContext()); 
    search.setIconified(false); 
    search.setSubmitButtonEnabled(false); 
    search.setOnQueryTextListener(this); 
    search.setQueryHint(getString(R.string.enter_the_word)); 

    menu.add(0, 1, 1, null) 
      .setIcon(android.R.drawable.ic_search_category_default) 
      .setActionView(search) 
      .setShowAsAction(
        MenuItem.SHOW_AS_ACTION_IF_ROOM 
          | MenuItem.SHOW_AS_ACTION_COLLAPSE_ACTION_VIEW); 
    return true; 
} 

Тогда я реализую onQueryTextChange метод:

@Override 
public boolean onQueryTextChange(String newText) { 
    // TODO Auto-generated method stub 
    if (TextUtils.isEmpty(newText)) { 
     dictionaryList.clearTextFilter(); 
    } else { 
     dictionaryList.setFilterText(newText); 
    } 
    return true; 
} 

dictionaryList является моим LisView.

Когда я запускаю свое приложение и набираю текст на своем устройстве, он ничего не делает! Что я сделал не так ?

+0

почему вы расширяете BaseAdapter и не использовать существующие адаптеры, которые уже реализуют фильтруемых? – pskink

+0

Я использую свой собственный класс для представления infromation в списке. –

+0

вы не ответили на мой вопрос, почему вы не используете, например, SimpleCursorAdapter? – pskink

ответ

1

Я нашел решение. Мне нужно было написать:

if (TextUtils.isEmpty(newText)) { 
     dictionaryList.clearTextFilter(); 
    } else { 
     //dictionaryList.setFilterText(newText); 
     dictionaryList.setSelectionAfterHeaderView(); 
     DictionaryListAdapter adapter = (DictionaryListAdapter) dictionaryList.getAdapter(); 
     adapter.getFilter().filter(newText); 
    } 

внутри onQueryTextChange

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