0

当我a在 EditText 上键入时,我想让add、<code>acer、...显示在下拉菜单中。我知道它可以通过AutoCompleteTextView 完成。但是我想让它也显示bat、<code>cat...,字符串a在一个单词中,而不是在前面。

4

2 回答 2

1

与您正在寻找的东西相同..

于 2012-07-25T03:56:40.710 回答
0

看起来您必须实现自己的Filter类。然后你必须实现一个 ListAdapter (包装你的字符串列表),它也实现了Filterable接口;调用 getFilter 时,此子类应返回您的自定义过滤器。您通过 setAdapter() 方法将自定义 ListAdapter/Filterable 传递到 AutoCompleteTextView。(实现这一切的一个简单方法是继承 Android 的 ArrayAdapter。)

这是 ArrayAdapter 的源代码。找到 ArrayFilter 的定义(在底部)并根据您的需要进行修改。以下代码是您可能正在寻找的带有修改的 ArrayFilter。在应用到您自己的 Adapter 子类之前,您必须研究 、 和 的mLock效果mObjectsmOriginalValues

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();
        }
    }
}
于 2012-07-25T03:47:10.557 回答