首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android AutoCompleteTextView

Android AutoCompleteTextView
EN

Stack Overflow用户
提问于 2012-07-25 03:06:42
回答 1查看 370关注 0票数 0

当我在EditText上键入EditText时,我希望在下拉菜单中让addacer、...show。我知道它可以用AutoCompleteTextView.完成但是我要它也显示batcat.,字符串a是在一个词中,而不是在前面。

EN

回答 1

Stack Overflow用户

发布于 2012-07-25 03:47:10

看起来,您必须实现自己的过滤器类。然后,您必须实现一个ListAdapter (封装您的字符串列表),它也实现了可过滤接口;当调用getFilter时,这个子类应该返回您的自定义过滤器。通过AutoCompleteTextView ()方法将自定义ListAdapter/Filterable传递给setAdapter。(实现这一切的一个简单方法是对安卓的ArrayAdapter进行子类化。)

这是ArrayAdapter的ArrayAdapter。找到ArrayFilter的定义(在底部),并根据您的需要修改它。下面的代码是可能需要修改的ArrayFilter。在应用到您自己的Adapter子类之前,您必须研究mLockmObjectsmOriginalValues的效果。

代码语言:javascript
复制
private class ArrayFilter extends Filter {
    @Override
    protected FilterResults performFiltering(CharSequence prefix) {
        FilterResults results = new FilterResults();

        if (mOriginalValues == null) {
            synchronized (mLock) {
                mOriginalValues = new ArrayList<T>(mObjects);
            }
        }

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

            ArrayList<T> values;
            synchronized (mLock) {
                values = new ArrayList<T>(mOriginalValues);
            }

            final int count = values.size();
            final ArrayList<T> newValues = new ArrayList<T>();
            for (int i = 0; i < count; i++) {
                final T value = values.get(i);
                final String valueText = value.toString().toLowerCase();

                if (valueText.contains(prefixString)) {
                    newValues.add(value);
                }
            }

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

        return results;
    }

    @Override
    protected void publishResults(CharSequence constraint, FilterResults results) {
        //noinspection unchecked
        mObjects = (List<T>) results.values;
        if (results.count > 0) {
            notifyDataSetChanged();
        } else {
            notifyDataSetInvalidated();
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11642122

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档