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,我的结果将是aa, bb而不是ee, ee。如果我搜索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();
            }

        }

您可以查看此帖子以获取更多信息:

过滤可扩展列表

过滤列表视图

于 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 回答