1

リストビューとそのアダプターをグローバル変数として保存しています。を拡張してリストを作成していませんListActivity。私のコードは次のとおりです。

public void onCreate(Bundle...) {
    mListView = (ListView) findViewById(R.id.listview1);
    //setting my custom array adapter...works fine.
    //also my custom adapter implements Filterable interface
    mListView.setAdapter(...) 
    mListView.setTextFilterEnabled(true);

    //My edit text where I enter my query
    mSearchEditText = (EditText) findViewById(R.id.searchEditText);
    mSearchEditText.addTextChangedLIstener(myListener);
}

private TextWatcher myListener = new TextWatcher () {

    public void onTextChanged(CharSequence s, int start, int before, int count) {
        if (s == null || s.length() == 0) {
            mListView.clearTextFilter();
        }
        else {
            mListView.setFilterText(s.toString());
        }
    }
    ...
    ...
}

私の問題は、編集テキストに文字列を入力すると、リスト内の使用可能な検索項目 (番号のみ) が正しく表示されますが、項目自体は表示されないことです。

たとえば、リストに項目aa、bb、cc、dd、ff、ee、ee がある場合

したがって、 ee を検索する、結果はee, ee ではなくaa, bbになります。ccを検索すると、フィルタ リストにはaaのみが表示されます。

誰でもこれについて私を助けることができますか?

4

2 に答える 2

3

実際の例があります。これを試してください:

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

TextWatcher filterTextWatcher = new TextWatcher() {

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

        }  
        public void onTextChanged(CharSequence s, int start, int before,int count) {  
            adapter.getFilter().filter(s);
        }

        @Override
        public void afterTextChanged(Editable s) {
            // TODO Auto-generated method stub              
        }  
    };

アダプタはimplements Filterable

            @Override
            public Filter getFilter() {
//              Filter filter = null;

                if(filter == null)
                    filter = new CheeseFilter();
                return filter;
            }

そしてフィルタークラス:

        public class CheeseFilter extends Filter {

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                // TODO Auto-generated method stub

                constraint = constraint.toString().toLowerCase();

                FilterResults newFilterResults = new FilterResults();

                if (constraint != null && constraint.length() > 0) {


                    ArrayList<String> auxData = new ArrayList<String>();

                    for (int i = 0; i < data.size(); i++) {
                        if (data.get(i).toLowerCase().contains(constraint))
                            auxData.add(data.get(i));
                    }

                    newFilterResults.count = auxData.size();
                    newFilterResults.values = auxData;
                } else {

                    newFilterResults.count = data.size();
                    newFilterResults.values = data;
                }

                return newFilterResults;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {

                ArrayList<String> resultData = new ArrayList<String>();

                resultData = (ArrayList<String>) results.values;

                EfficientAdapter adapter = new EfficientAdapter(context, resultData);
                list.setAdapter(adapter);

//              notifyDataSetChanged();
            }

        }

詳細については、この投稿を確認してください。

expandableList をフィルタ

ListView のフィルター

于 2012-04-03T15:31:12.733 に答える
0

リストビューではなく、アダプタに直接設定する必要があります。したがって、リストビューに設定したアダプタの参照を保持し、テキスト変更リスナーで次のようなことを試してください。

private TextWatcher myListener = new TextWatcher () 
{

    public void onTextChanged(CharSequence s, int start, int before, int count) 
    {
       myadapter.getFilter().filter(s);
    }
    ...
    ...
}
于 2012-04-03T13:18:07.997 に答える