我用ListView和ActionBarSharlock(ABS)编写了一个简单的应用程序。我有我的对象,自定义ArrayAdapter,在我的ABS我有SearchView和下拉列表,现在关于我的问题,如果我在搜索之前搜索所有工作正常,但在“搜索”之后排序函数被打破。
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;
}
我做错了什么?
答案 0 :(得分:1)
我做错了什么?
无。问题是ArrayAdapter
是错误的。
API 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);
}
正如您所看到的,它有时会对不同的列表进行排序。实际上,在您第一次过滤它之后,mOriginalValues
变为非空。
有一种解决方法。每次更改(排序,插入等)到列表后,您必须使用相同的文本值再次过滤它。
我始终建议不要使用ArrayAdapter
,而是在需要时使用您自己的BaseAdapter
版本构建Filter
。
修改强>
刚刚发现这已经是几年已知的问题了:http://code.google.com/p/android/issues/detail?id=9666