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