BaseAdapter列表视图筛选的Andr​​oid [英] BaseAdapter Listview Filtering Android

查看:105
本文介绍了BaseAdapter列表视图筛选的Andr​​oid的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在我的列表视图,我有文字和图片,他们都存储在的ArrayList

In my Listview, I am having text and image and they are stored in ArrayList.

我使用 BaseAdapter 显示列表。

我想用过滤器基于文本的的EditText 键入的列表中,但不能正常工作。

I want to use filter on the list based on text typed in EditText, but is not working.

我的code是:副词是的EditText

My code is : adv is 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 工具可筛选用getFilter 方法在是:

And my BaseAdapter implements Filterable so getFilter method in that is:

@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();
            }

    }
}

mNames 的ArrayList 与我想要过滤的的ListView

in that mNames is the ArrayList with which I want to filter the ListView.

和同时启用 setTextFilterEnabled(真)。,但滤波是行不通的。

and also enabled setTextFilterEnabled(true)., but filtering is not working.

这是正确的做法?有什么不对的呢?如果没有,那怎么办?

Is this correct approach? what's wrong in it? if not, how to do that?

推荐答案

这个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;
    }
}

这篇关于BaseAdapter列表视图筛选的Andr​​oid的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆