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

ご覧のとおり、異なるリストをソートすることがあります。実際には、最初にフィルタリングした後、mOriginalValuesnull にはなりません。

それには回避策があります。リストを変更 (並べ替え、挿入など) するたびに、同じテキスト値で再度フィルター処理する必要があります。

必要に応じて、使用せずに独自の実装ArrayAdapterを構築することを常にお勧めします。BaseAdapterFilter

編集:

これはすでに数年前から知られている問題であることがわかりました: http://code.google.com/p/android/issues/detail?id=9666

于 2013-06-20T20:34:52.117 に答える