0

私はこれに頭をぶつけて2日間オンとオフを繰り返しています。

getfilter.filter()を使おうとしましたが、うまくいきませんでした。そこで、リストを検索するためにこのコードを作成しました。動作しますが、いくつかの文字を削除すると、リストが最後の結果でスタックし、更新されません。

例:リスト:こんにちは、こんにちは、ハン、ソロ

「h」と入力すると、hello、hi、hanが表示されます。

'e'を追加すると、その'he'のみが表示されます

eを削除しても、hanとhiは再び表示されません。

private TextWatcher filterTextWatcher = new TextWatcher() {
     final ArrayList<String> finalItems = mItems;
    @Override
    public void afterTextChanged(Editable s) {
    }

    @Override
    public void beforeTextChanged(CharSequence s, int start, int count,
            int after) {
    }



    @Override
    public void onTextChanged(CharSequence s, int start, int before,
            int count) {
        ArrayList<String> searchedItems = retainsSearched(mItems, s.toString());
        adapter.clear();
        for (int i = 0; i < searchedItems.size(); i++) {
            adapter.add(searchedItems.get(i));
        }
        adapter.notifyDataSetChanged();
    }

};

public  ArrayList<String> retainsSearched(ArrayList<String> mItems2, String term) {
    ArrayList<String> stations = new ArrayList<String>();
    for (int i = 0; i < mItems2.size(); i++) {
        if (mItems2.get(i).toLowerCase().startsWith(term.toLowerCase())) {
            stations.add(mItems2.get(i));
        }
    }
    return stations;
}
4

1 に答える 1

1

「h」と入力すると、hello、hi、および han が表示されます。「e」を追加すると、その「彼」だけが表示され、e を削除すると、han と hi が再び表示されなくなります。

これは、mItemsで使用するTextWatcherリストがアダプターをサポートしているリストであるため、アダプターを変更することで (アダプターでアイテムをフィルター処理およびクリア/再追加するときに) アダプターで使用可能なアイテムの数を常に減らすために発生する可能性が最も高いです。リストをフィルタリングするたびに「表示」されるアイテム。

代わりに、アダプターで最初の項目 (mItemsリスト) のコピーを作成し、常にそのコピー内の項目をテストしてフィルター処理を行います (ただし、変更しないで、一致した項目をアダプターに追加するだけです)。

繰り返しますが、getFilter()メソッドを使用する必要があります。

編集:

ArrayList<String> searchedItems = retainsSearched(s.toString()); 
// ...

public  ArrayList<String> retainsSearched(ArrayList<String term) {
    ArrayList<String> stations = new ArrayList<String>();
    for (int i = 0; i < copyList.size(); i++) {
        if (copyList.get(i).toLowerCase().startsWith(term.toLowerCase())) {
            stations.add(copyList.get(i));
        }
    }
}
于 2012-12-08T11:16:15.057 に答える