过滤与搜索查看和自定义适配器一个ListView [英] Filtering a ListView with SearchView and custom adapter

查看:150
本文介绍了过滤与搜索查看和自定义适配器一个ListView的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我已经无法让我的ListView进行排序。当我在搜索查看类型,什么都不会发生。我的ListView没有变化。我一直比较这里和其他地方发现,没有运气的例子。我已经通过调试证实,该过滤器实际上没有工作,我可以看到filteredArray被填充什么过滤的数据,但是也没有改变的ListView

下面是我迄今。在MainActivity.class ..

 公共布尔onCreateOptionsMenu(菜单菜单){
        。getMenuInflater()膨胀(R.menu.main,菜单);        SearchManager的SearchManager的=(SearchManager的)getSystemService(Context.SEARCH_SERVICE);
        搜索查看搜索查看=(搜索查看)menu.findItem(R.id.action_search).getActionView();        sea​​rchView.setSubmitButtonEnabled(假);
        sea​​rchView.setQueryHint(输入#..);
        sea​​rchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));        SearchView.OnQueryTextListener queryTextListener =新SearchView.OnQueryTextListener(){
            @覆盖
            公共布尔onQueryTextSubmit(String s)将{
                返回false;
            }            @覆盖
            公共布尔onQueryTextChange(String s)将{
                ListView控件的ListView =(ListView控件)findViewById(R.id.main_listView);
                listView.setTextFilterEnabled(真);                如果(s.isEmpty()){
                    listView.clearTextFilter();
                }其他{
                    。customAdapter.getFilter()过滤器(S);
                }                返回true;
            }
        };        sea​​rchView.setOnQueryTextListener(queryTextListener);        返回super.onCreateOptionsMenu(菜单);
    }

我创建这样的customAdapter对象和listCustom包含所有CustomResults类。

  customAdapter =新CustomAdapter(MainActivity.this,listCustom);

CustomAdapter:

 公共类CustomAdapter扩展BaseAdapter实现过滤的{
    私有静态的ArrayList< CustomResults> customArrayList;
    私有静态的ArrayList< CustomResults> filteredArrayList;    私人LayoutInflater mInflater;    公共CustomAdapter(上下文的背景下,ArrayList的< CustomResults>业绩){
        customArrayList =结果;
        mInflater = LayoutInflater.from(上下文);
    }    公众诠释的getCount(){
        返回customArrayList.size();
    }    公共对象的getItem(INT位置){
        返回customArrayList.get(位置);
    }    众长getItemId(INT位置){
        返回的位置;
    }    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        ViewHolder持有人;
        如果(convertView == NULL){
            convertView = mInflater.inflate(R.layout.custom_row,NULL);            持有人=新ViewHolder();
            holder.name =(TextView中)convertView.findViewById(R.id.name);
            holder.num =(TextView中)convertView.findViewById(R.id.number);
            convertView.setTag(保持器);
        }其他{
            支架=(ViewHolder)convertView.getTag();
        }        holder.name.setText(customArrayList.get(位置).getName());
        holder.num.setText(customArrayList.get(位置).getNum());        返回convertView;
    }    静态类ViewHolder {
        TextView的名称;
        TextView的NUM;
    }    @覆盖
    公共过滤用getFilter(){
        过滤器过滤器=新的过滤器(){            @燮pressWarnings(未登记)
            @覆盖
            保护无效publishResults(CharSequence的约束,FilterResults结果){                如果(results.count == 0){
                    notifyDataSetInvalidated();
                }其他{
                    filteredArrayList =(ArrayList的< CustomResults>)results.values​​;
                    notifyDataSetChanged();
                }            }            @覆盖
            保护FilterResults performFiltering(CharSequence的约束){                字符串filterString = constraint.toString()与toLowerCase()。
                FilterResults结果=新FilterResults();                诠释计数= customArrayList.size();                ArrayList的< CustomResults> filteredList =新的ArrayList< CustomResults>();                对于(CustomResults定制:customArrayList){
                    filteredList.add(自定义);
                }                串filterableString;                的for(int i = 0; I<计数;我++){
                    filterableString = customArrayList.get(ⅰ).getNum();
                    如果(filterableString.toLowerCase()。包括(filterString)){
                        filteredList.add(customArrayList.get(I));
                    }否则如果(customArrayList.get(ⅰ).getName()。与toLowerCase()。含有(filterString)){
                        filteredList.add(customArrayList.get(I));
                    }
                }                results.values​​ = filteredList;
                results.count = filteredList.size();                返回结果;
            }
        };        返回过滤器;    }


解决方案

getView()等函数从customArrayList,从来没有从filteredArrayList始终检索。

I've been unable to get my ListView to sort. When I type in the SearchView, nothing happens. My ListView has no changes. I've been comparing examples found here and elsewhere with no luck. I've confirmed through debugging that the filter actually does work, I can see the filteredArray being populated with what filtered data, but again, no ListView change.

Here is what I have so far. In MainActivity.class..

public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.main, menu);

        SearchManager searchManager = (SearchManager) getSystemService(Context.SEARCH_SERVICE);
        SearchView searchView = (SearchView) menu.findItem(R.id.action_search).getActionView();

        searchView.setSubmitButtonEnabled(false);
        searchView.setQueryHint("Enter #..");
        searchView.setSearchableInfo(searchManager.getSearchableInfo(getComponentName()));

        SearchView.OnQueryTextListener queryTextListener = new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String s) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String s) {
                ListView listView = (ListView) findViewById(R.id.main_listView);
                listView.setTextFilterEnabled(true);

                if (s.isEmpty()) {
                    listView.clearTextFilter();
                } else {
                    customAdapter.getFilter().filter(s);
                }

                return true;
            }
        };

        searchView.setOnQueryTextListener(queryTextListener);

        return super.onCreateOptionsMenu(menu);
    }

I create the customAdapter object like this and listCustom contains all the CustomResults classes.

customAdapter = new CustomAdapter(MainActivity.this, listCustom);

CustomAdapter:

public class CustomAdapter extends BaseAdapter implements Filterable {
    private static ArrayList<CustomResults> customArrayList;
    private static ArrayList<CustomResults> filteredArrayList;

    private LayoutInflater mInflater;

    public CustomAdapter(Context context, ArrayList<CustomResults> results) {
        customArrayList = results;
        mInflater = LayoutInflater.from(context);
    }

    public int getCount() {
        return customArrayList.size();
    }

    public Object getItem(int position) {
        return customArrayList.get(position);
    }

    public long getItemId(int position) {
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.custom_row, null);

            holder = new ViewHolder();
            holder.name = (TextView) convertView.findViewById(R.id.name);
            holder.num = (TextView) convertView.findViewById(R.id.number);


            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.name.setText(customArrayList.get(position).getName());
        holder.num.setText(customArrayList.get(position).getNum());

        return convertView;
    }

    static class ViewHolder {
        TextView name;
        TextView num;
    }

    @Override
    public Filter getFilter() {
        Filter filter = new Filter() {

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

                if (results.count == 0) {
                    notifyDataSetInvalidated();
                } else {
                    filteredArrayList = (ArrayList<CustomResults>) results.values;
                    notifyDataSetChanged();
                }

            }

            @Override
            protected FilterResults performFiltering(CharSequence constraint) {

                String filterString = constraint.toString().toLowerCase();
                FilterResults results = new FilterResults();

                int count = customArrayList.size();

                ArrayList<CustomResults> filteredList = new ArrayList<CustomResults>();

                for (CustomResults custom : customArrayList) {
                    filteredList.add(custom);
                }

                String filterableString ;

                for (int i = 0; i < count; i++) {
                    filterableString = customArrayList.get(i).getNum();
                    if (filterableString.toLowerCase().contains(filterString)) {
                        filteredList.add(customArrayList.get(i));
                    } else if (customArrayList.get(i).getName().toLowerCase().contains(filterString)) {
                        filteredList.add(customArrayList.get(i));
                    }
                }

                results.values = filteredList;
                results.count = filteredList.size();

                return results;
            }
        };

        return filter;

    }

解决方案

getView() and other functions retrieve always from customArrayList and never from filteredArrayList.

这篇关于过滤与搜索查看和自定义适配器一个ListView的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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