0

aEditTextを入力するaddと、ドロップダウン メニューに、<code>acer、... が表示されるようにしたいと考えています。AutoCompleteTextViewで完了することができることはわかっています。batしかし、<code>cat...も表示したいのですが、文字列aは先頭ではなく単語の中にあります。

4

2 に答える 2

1

ここにあなたが探しているものと同じものがあります..

于 2012-07-25T03:56:40.710 に答える
0

独自のFilterクラスを実装する必要があるようです。次に、 Filterableインターフェイスも実装する ListAdapter (文字列のリストをラップする) を実装する必要があります。このサブクラスは、getFilter が呼び出されたときにカスタム フィルターを返す必要があります。setAdapter() メソッドを介して、カスタム ListAdapter/Filterable を AutoCompleteTextView に渡します。(これをすべて行う簡単な方法は、Android の ArrayAdapter をサブクラス化することです。)

ArrayAdapterのソース コードは次のとおりです。ArrayFilter の定義 (下部) を見つけて、必要に応じて変更します。次のコードは、お探しの変更を加えた ArrayFilter です。独自の Adapter サブクラスに適用する前にmLock、 、mObjects、およびの効果を調べる必要があります。mOriginalValues

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 に答える