2

これが私のフィルターのコードです:

private class NameFilter extends Filter {

    @Override
    protected FilterResults performFiltering(CharSequence constraint) {
        // NOTE: this function is *always* called from a background thread,
        // and
        // not the UI thread.
        constraint = constraint.toString().toLowerCase();
        FilterResults result = new FilterResults();
        if (constraint != null && constraint.toString().length() > 0) {
            ArrayList<Place> filt = new ArrayList<Place>();
            ArrayList<Place> lItems = new ArrayList<Place>();
            synchronized (this) {
                lItems.addAll(objects);
            }
            for (int i = 0, l = lItems.size(); i < l; i++) {
                Place m = lItems.get(i);
                if (m.getName().toLowerCase().contains(constraint))
                    filt.add(m);
            }
            result.count = filt.size();
            result.values = filt;
        } 
        else {
            synchronized (this) {
                result.values = objects;
                result.count = objects.size();
            }
        }
        return result;
    }

    @SuppressWarnings("unchecked")
    @Override
    protected void publishResults(CharSequence constraint,
            FilterResults results) {
        // NOTE: this function is *always* called from the UI thread.
        filtered = (ArrayList<Place>) results.values;
        notifyDataSetChanged();
        clear();
        for (int i = 0, l = filtered.size(); i < l; i++)
            add(filtered.get(i));
        notifyDataSetInvalidated();
    }

}

これが私のアクティビティコードです:

lvPlace = (ListView) findViewById(R.id.listView1);

    final ArrayList<Place> searchResults = GetSearchResults();

    filterEditText = (EditText) findViewById(R.id.filter_text);
    filterEditText.addTextChangedListener(filterTextWatcher);

    adapter = new PlaceAdapter(this, 0, searchResults);

    lvPlace.setAdapter(adapter);
    lvPlace.requestFocus();
    lvPlace.setTextFilterEnabled(true);

private TextWatcher filterTextWatcher = new TextWatcher() {

    public void afterTextChanged(Editable s) {
    }

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

    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (adapter != null) {
            adapter.getFilter().filter(s.toString().toLowerCase());
            filterEditText.getText().toString();
        } else {
            Log.d("filter", "no filter availible");
        }
    }

};

@Override
protected void onDestroy() {
    super.onDestroy();
    filterEditText.removeTextChangedListener(filterTextWatcher);
}

検索ボックスに何かを入力しているときはうまく機能していたので、しばらくこれに苦労しましたが、検索フィールドからテキストを削除すると、リストが初期状態に戻りません。この問題を解決するのを手伝ってください!

4

2 に答える 2

0

検索ボックスに何かを入力しているときは正常に機能していましたが、検索フィールドリストからテキストを削除すると、初期状態に戻りませんでした。

アダプタのコードが表示されない場合、これは、アダプタで使用される初期値への参照を保持していないために発生する可能性があります。たとえばArrayList、アダプタにwithデータを設定し、フィルタリングに文字を入力し始めた場合、EditTextこれは機能します。これは、フィルタリングによって、以前の値のセット(常に使用可能)のサブセットのみを使用しているためです。から文字を削除するEditTextと、前の値のセットでフィルタリングを実行する必要がありますが、そのセットが置き換えられたため、値はもう存在せず、フィルタリングが機能しなくなります。

解決策は、初期値のコピーArrayListを作成して、フィルタリングを実行するための完全な値を常に持つことです。のコピーの1つArrayListはアダプターによって使用され(これはフィルタリングの結果ArrayListに置き換えられます)、もう1つはメソッドでpublishResultsフィルターによるフィルタリングを実行するために使用されます(これArrayListは同じままです!)performFiltering

于 2012-10-01T18:08:38.033 に答える
0

あなたの方法でこれを試してくださいpublishResults

protected void publishResults(CharSequence constraint,FilterResults results)
{   
    filtered.clear();
    filtered = (ArrayList<Place>) results.values;
    if(filtered.size() < 1)
        filtered = objects;

    notifyDataSetChanged();

    for (int i = 0, l = filtered.size(); i < l; i++)
        add(filtered.get(i));
    notifyDataSetInvalidated();
}

このコードを使用すると、フィルター メソッドで else 句を取り出すことができます。

さらに、次のようなループを使用して for ループをもう少し効率的にすることもできます。

for(Place place : filtered)
    add(place);
于 2012-10-01T18:02:35.723 に答える