Android AutoCompleteTextView建议替代方案

时间:2011-11-16 10:13:05

标签: android autocompletetextview

是否可以使用AutoCompleteTextView查找字符串,但建议另一个字符串?

例如,如果用户键入'Yau'或'yauh',则会显示'Yáuh',因此用户无需键入特殊字符。

3 个答案:

答案 0 :(得分: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();
            }
        }
        }
    }

答案 1 :(得分:0)

我没有尝试过,但这肯定会......

您尚未指定数据是在数组还是数据库中,所以我将假设一个数组(或列表)。

覆盖适配器的getFilter()。 (检查this question以了解具体方法)

现在,在该示例中(在链接中),作者使用startsWith来过滤结果。相反,你将不得不使用自己的比较方法来考虑这些特殊字符。 (如,将á等同于a

答案 2 :(得分:-1)

有AutoCompleteTextView,所以我想这就是你需要的:

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

以下是官方信息:AutoCompleteTextView

我刚刚看到有一个教程,Tutorial of AutoCompleteTextView