-1

我用 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;
            }

我做错了什么?

4

1 回答 1

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);
}

如您所见,它有时会对不同的列表进行排序。实际上,在您第一次过滤它之后,它mOriginalValues变得不为空。

有一个解决方法。在对列表进行每次更改(排序、插入等)后,您必须使用相同的文本值再次对其进行过滤。

我总是建议不要使用,而是在需要时使用您自己的实现ArrayAdapter来构建。BaseAdapterFilter

编辑:

刚刚发现这是几年前的一个已知问题:http ://code.google.com/p/android/issues/detail?id=9666

于 2013-06-20T20:34:52.117 回答