2013-06-20 4 views
-1

Я написал просто приложение с ListView и ActionBarSharlock (ABS). У меня есть мои объекты, пользовательский ArrayAdapter, в моем АБС. У меня есть SearchView и выпадающий список, теперь о моей проблеме, если я что-то искал, прежде чем сортировка все работает нормально, но после «поиска» функция сортировки сломана.Broken sort after search

public boolean onNavigationItemSelected(int position, long itemId) { 
         switch (position) { 
         case 0: 
          countryArrayAdapter.sort(new SortByAZ()); 
          break; 
         case 1: 

................... 


     SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() { 
      public boolean onQueryTextChange(String newText) { 
       countryArrayAdapter.getFilter().filter(newText); 
       return true; 
      } 

Что я делаю неправильно?

ответ

1

Что я делаю неправильно?

Ничего. Проблема ArrayAdapter является ошибкой.

Соответствующий код из API 17 реализации ArrayAdapter:

public void sort(Comparator<? super T> comparator) { 
    synchronized (mLock) { 
     if (mOriginalValues != null) { 
      Collections.sort(mOriginalValues, comparator); 
     } else { 
      Collections.sort(mObjects, comparator); 
     } 
    } 
    if (mNotifyOnChange) notifyDataSetChanged(); 
} 

public T getItem(int position) { 
    return mObjects.get(position); 
} 

Как вы можете видеть, это иногда сортирует другой список. Фактически после первого фильтра, становится не null.

Существует обходное решение для этого. Вы должны отфильтровать его снова с тем же текстовым значением после каждого изменения (сортировка, вставка и т. Д.) В список.

Я всегда предлагаю не использовать ArrayAdapter и вместо этого строить на BaseAdapter с вашим собственным Filter при необходимости.

Edit:

Просто нашли это известная проблема, уже несколько лет: http://code.google.com/p/android/issues/detail?id=9666