4

文字列を検索するが、代替文字列を提案するAutoCompleteTextViewを持つことは可能ですか?

たとえば、ユーザーが「Yau」または「yauh」と入力すると、「Yáuh」が提案されるため、ユーザーは特殊文字を入力する必要がありません。

4

3 に答える 3

1

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();
            }
        }
        }
    }
于 2011-11-17T10:52:40.943 に答える
0

私はこれを試していませんが、これは確かにうまくいくでしょう...

データが配列にあるかDBにあるかを指定していないので、配列(またはリスト)を想定します。

getFilter()アダプタの をオーバーライドします。(この質問をチェックして方法を確認してください)

さて、その例(リンク内)では、著者はstartsWith結果をフィルタリングするために使用しています。代わりに、これらの特殊文字も考慮する独自の比較方法を使用する必要があります。á(のように、と同等a)

于 2011-11-16T12:44:27.920 に答える
-1

AutoCompleteTextView があるので、それが必要だと思います。

<AutoCompleteTextView
        android:id="@+id/autoCompleteTextView1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="MyAutoCompleteTextView" >
</AutoCompleteTextView>

公式情報は次のとおりです: AutoCompleteTextView

私はチュートリアルさえあることを見てきました、AutoCompleteTextViewのチュートリアル

于 2011-11-16T10:26:44.407 に答える