文字列を検索するが、代替文字列を提案するAutoCompleteTextViewを持つことは可能ですか?
たとえば、ユーザーが「Yau」または「yauh」と入力すると、「Yáuh」が提案されるため、ユーザーは特殊文字を入力する必要がありません。
文字列を検索するが、代替文字列を提案するAutoCompleteTextViewを持つことは可能ですか?
たとえば、ユーザーが「Yau」または「yauh」と入力すると、「Yáuh」が提案されるため、ユーザーは特殊文字を入力する必要がありません。
ArrayAdapterを拡張してみましたが、上書きされていないようです。
import java.util.ArrayList;
import java.util.List;
import android.content.Context;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.Filterable;
public class foreignAdapter<T> extends ArrayAdapter implements Filterable {
String temp;
String word;
private List<T> mObjects;
private final Object mLock = new Object();
private ArrayList<T> mOriginalValues;
public foreignAdapter(Context context, int resource, T[] object) {
super(context, resource, object);
}
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) {
synchronized (mLock) {
ArrayList<T> list = new ArrayList<T>(mOriginalValues);
results.values = list;
results.count = list.size();
}
}
else {
String prefixString = prefix.toString().toLowerCase();
final ArrayList<T> values = mOriginalValues;
final int count = values.size();
final ArrayList<T> newValues = new ArrayList<T>(count);
for (int i = 0; i < count; i++) {
final T value = values.get(i);
final String valueText = value.toString().toLowerCase();
/* Run for each character in the string */
for(int j=0;j<valueText.length();j++)
{
switch(valueText.charAt(j))
{
case 'á':
case 'ā':
case 'à':
temp+='a';
break;
case 'í':
case 'ī':
case 'ì':
temp+='i';
break;
case 'è':
case 'ē':
case 'é':
temp+='e';
break;
case 'ó':
case 'ō':
case 'ò':
temp+='o';
break;
case 'ú':
case 'ū':
case 'ù':
temp+='u';
break;
case 'ģ':
temp+='g';
break;
default:
temp+=word.charAt(j);
break;
}
}
// First match against the whole, non-splitted value
if (temp.startsWith(prefixString)) {
newValues.add(value);
} else {
final String[] words = temp.split(" ");
final int wordCount = words.length;
for (int k = 0; k < wordCount; k++) {
if (words[k].startsWith(prefixString)) {
newValues.add(value);
break;
}
}
}
}
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();
}
}
}
}
私はこれを試していませんが、これは確かにうまくいくでしょう...
データが配列にあるかDBにあるかを指定していないので、配列(またはリスト)を想定します。
getFilter()
アダプタの をオーバーライドします。(この質問をチェックして方法を確認してください)
さて、その例(リンク内)では、著者はstartsWith
結果をフィルタリングするために使用しています。代わりに、これらの特殊文字も考慮する独自の比較方法を使用する必要があります。á
(のように、と同等a
)
AutoCompleteTextView があるので、それが必要だと思います。
<AutoCompleteTextView
android:id="@+id/autoCompleteTextView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="MyAutoCompleteTextView" >
</AutoCompleteTextView>
公式情報は次のとおりです: AutoCompleteTextView
私はチュートリアルさえあることを見てきました、AutoCompleteTextViewのチュートリアル