简体   繁体   English

筛选AutoCompleteTextView以显示部分匹配

[英]Filtering AutoCompleteTextView to show partial match

Right now I have an AutoCompleteTextView and I want it to work just like the like "%xxx%" does in SQL. 现在,我有一个AutoCompleteTextView,并且希望它像SQL中的like "%xxx%"一样工作。 I attempted to do it using Filterable I have it and the code runs but it just displays everything now even if there is no partial match. 我尝试使用Filterable做到这一点,并且代码可以运行,但是即使没有部分匹配,它现在也会显示所有内容。 Any help would be appreciated. 任何帮助,将不胜感激。

public class CodesArrayAdapter extends ArrayAdapter implements Filterable{

    List<String> allCodes;
    List<String> originalCodes;

    StringFilter filter;


    public CodesArrayAdapter(Context context, int resource, List<String> keys) {
        super(context, resource, keys);

        allCodes=keys;
        originalCodes=keys;


    }

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

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

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

    private class StringFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

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

            FilterResults results = new FilterResults();

            final List<String> list = originalCodes;

            int count = list.size();
            final ArrayList<String> nlist = new ArrayList<String>(count);

            String filterableString ;

            for (int i = 0; i < count; i++) {
                filterableString = list.get(i);
                if (filterableString.toLowerCase().contains(filterString)) {
                    nlist.add(filterableString);
                }
            }

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

            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            allCodes = (ArrayList<String>) results.values;
            notifyDataSetChanged();
        }

    }
}

If this is the complete code of your adapter, you just missed implementing the getFilter() method, ie 如果这是您适配器的完整代码,则您只是错过了实现getFilter()方法的时间,即

@Override
public Filter getFilter()
{
    return new StringFilter();
}

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM