BaseAdapter Listview过滤Android

BaseAdapter Listview过滤Android,android,listview,Android,Listview,在我的列表视图中,我有文本和图像,它们存储在数组列表中 我正在使用BaseAdapter显示列表 我想根据在EditText中键入的文本,在列表上使用过滤器,但不起作用 我的代码是:adv是EditText adv.addTextChangedListener(new TextWatcher() { @Override public void onTextChanged(CharSequence s, int arg1, int arg2,

在我的
列表视图中,我有文本和图像,它们存储在
数组列表中

我正在使用
BaseAdapter
显示列表

我想根据在
EditText
中键入的文本,在列表上使用
过滤器
,但不起作用

我的代码是:adv是EditText

  adv.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence s, int arg1, int arg2, int arg3) {
                // TODO Auto-generated method stub
                viewadapter.getFilter().filter(s);

            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

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

            }
        });
我的
BaseAdapter
实现了
Filterable
so
getFilter
方法,即:

@Override
        public Filter getFilter() {
            // TODO Auto-generated method stub
             if (mFilter == null) {
                    mFilter = new ArrayFilter();
                }
                return mFilter;
        }
我的
ArrayFilter
是:

 private class ArrayFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence prefix) {
            FilterResults results = new FilterResults();

            if (mNames == null) {
                synchronized (mLock) {
                    mNames = new ArrayList<String>(mObjects);
                }
            }

            if (prefix == null || prefix.length() == 0) {
                synchronized (mLock) {
                    ArrayList<String> list = new ArrayList<String>(mNames);
                    results.values = list;
                    results.count = list.size();
                }
            } else {
                String prefixString = prefix.toString().toLowerCase();

                final ArrayList<String> values = mNames;
                final int count = values.size();

                final ArrayList<String> newValues = new ArrayList<String>(count);

                for (int i = 0; i < count; i++) {
                    final String value = values.get(i);
                    final String valueText = value.toString().toLowerCase();

                    // First match against the whole, non-splitted value
                    if (valueText.startsWith(prefixString)) {
                        newValues.add(value);
                    } else {
                        final String[] words = valueText.split(" ");
                        final int wordCount = words.length;

                        for (int k = 0; k < wordCount; k++) {
                            if (words[k].startsWith(prefixString)) {
                                newValues.add(value);
                                break;
                            }
                        }
                    }
                }

                results.values = newValues;
                results.count = newValues.size();
            }

            return results;
        }

        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            //noinspection unchecked
            mObjects = (List<String>) results.values;
            if (results.count > 0) {
                viewadapter.notifyDataSetChanged();
            } else {
                viewadapter.notifyDataSetInvalidated();
            }

    }
}
私有类ArrayFilter扩展了过滤器{
@凌驾
受保护的筛选器结果执行筛选(字符序列前缀){
FilterResults results=新的FilterResults();
if(mNames==null){
已同步(mLock){
mNames=新的阵列列表(mObjects);
}
}
if(prefix==null | | prefix.length()==0){
已同步(mLock){
ArrayList=新的ArrayList(mNames);
结果.值=列表;
results.count=list.size();
}
}否则{
字符串prefixString=prefix.toString().toLowerCase();
最终ArrayList值=mNames;
最终整数计数=values.size();
最终ArrayList newValues=新ArrayList(计数);
for(int i=0;i0){
viewadapter.notifyDataSetChanged();
}否则{
viewadapter.notifyDataSetionValidated();
}
}
}
其中
mNames
ArrayList
,我想用它来过滤
列表视图

并且还启用了
setTextFilterEnabled(true)。
,但筛选不起作用


这是正确的方法吗?有什么问题吗?如果没有,怎么做?

这是API演示示例

public class SearchViewFilterMode extends Activity implements SearchView.OnQueryTextListener {

    private static final String TAG = "SearchViewFilterMode";

    private SearchView mSearchView;
    private ListView mListView;
    private ArrayAdapter<String> mAdapter;

    private final String[] mStrings = Cheeses.sCheeseStrings;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

        setContentView(R.layout.searchview_filter);

        mSearchView = (SearchView) findViewById(R.id.search_view);
        mListView = (ListView) findViewById(R.id.list_view);
        mListView.setAdapter(mAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                mStrings));
        mListView.setTextFilterEnabled(true);
        setupSearchView();
    }

    private void setupSearchView() {
        mSearchView.setIconifiedByDefault(false);
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setSubmitButtonEnabled(false);
        mSearchView.setQueryHint(getString(R.string.cheese_hunt_hint));
    }

    public boolean onQueryTextChange(String newText) {
        if (TextUtils.isEmpty(newText)) {
            mListView.clearTextFilter();
        } else {
            mListView.setFilterText(newText.toString());
        }
        return true;
    }

    public boolean onQueryTextSubmit(String query) {
        return false;
    }
}
公共类SearchViewFilterMode扩展活动实现SearchView.OnQueryTextListener{
私有静态最终字符串标记=“SearchViewFilterMode”;
私有搜索视图;
私有列表视图;
私人ArrayaAdapter mAdapter;
私有最终字符串[]mStrings=Cheeses.sCheeseStrings;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE\u ACTION\u栏);
setContentView(R.layout.searchview\u过滤器);
mSearchView=(SearchView)findViewById(R.id.search\u视图);
mListView=(ListView)findViewById(R.id.list\u视图);
mListView.setAdapter(mAdapter=new ArrayAdapter(此,
android.R.layout.simple\u list\u item\u 1,
mStrings);
mListView.setTextFilterEnabled(true);
setupSearchView();
}
私有void setupSearchView(){
mSearchView.setIconifiedByDefault(false);
mSearchView.setOnQueryTextListener(此);
mSearchView.setSubmitButtonEnabled(false);
mSearchView.setQueryHint(getString(R.string.cheese\u hunt\u hint));
}
公共布尔onQueryTextChange(字符串newText){
if(TextUtils.isEmpty(newText)){
mListView.clearTextFilter();
}否则{
mListView.setFilterText(newText.toString());
}
返回true;
}
公共布尔值onQueryTextSubmit(字符串查询){
返回false;
}
}

您解决了这个问题吗?你能给我们一个反馈吗?不,我没有得到解决,那就是我一直开着!!如果您有这样的想法,请在这里发布您是如何在ArrayList中保存文本和图像的???我希望这个示例可以帮助您[如何将getfilter与baseadapter一起使用的示例][1][1]: