overriding filterresults in android autocompletetextview?

安稳与你 提交于 2019-12-10 14:28:55

问题


i've been pulling my hair over this a few days, I'm trying to setup an autocompletetextview in android where the user inputs a key and the autocomplete suggestions are the values, however I've tried this about 10 different ways now, extending BaseAdapter, SimpleAdapter and now ArrayAdapter, and I've noticed via the debugger that my resultset is fine, however I really have no idea what i'm supposed to be doing in the publishResults() section of the code. The first argument is custom autocompletetextview control using the following XML:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="fill_parent"
    android:layout_height="fill_parent">
        <TextView android:id="@+id/txtInnerView2" android:layout_width="fill_parent"
            android:layout_height="wrap_content">
        </TextView>
</LinearLayout>

and the class looks like this:

public class NewArrayAdapter<T> extends ArrayAdapter implements Filterable {
    ArrayList<String> allWords;
    ArrayList<String> resultWords;
    String value[] = { "Awesome", "Bear", "Cat", "Dog" };
    String key[] = { "A", "B", "C", "D" };

    public NewArrayAdapter(Context context, int resource, int textViewResourceId) {
        super(context, resource, textViewResourceId);
        // TODO Auto-generated constructor stub
        allWords = new ArrayList<String>();
        resultWords = new ArrayList<String>();
    }

    @Override
    public Filter getFilter() {
        Filter custom_filter = new Filter() {
            @Override
            protected FilterResults performFiltering(CharSequence constraint) {
                FilterResults f = new FilterResults();
                if (constraint != null) {
                    ArrayList<String> lstResults = new ArrayList<String>();
                    for (int x = 0; x < key.length; x++) {
                        if (key[x].startsWith(constraint.toString().toUpperCase())) {
                            lstResults.add(value[x]);
                        }
                    }
                    f.values = lstResults;
                    f.count = lstResults.size();
                }
                return f;
            }

            @Override
            protected void publishResults(CharSequence constraint, FilterResults results) {
                resultWords.clear();
                if (results.count > 0) {
                    resultWords.addAll((Collection<? extends String>) results.values);
                    notifyDataSetChanged(); 
                } else {
                    notifyDataSetInvalidated();
                }
            }
        };
        return custom_filter;
    }
}

int the constructor, public NewArrayAdapter(Context context, int resource, int textViewResourceId, List objects) the 2nd argument is the autocompletetextview, the 3rd is the nested TextView, and the 4th is a reference to the List that i can only assume is what eventually should be the resultset, but apparently isn't... this is driving me nuts, does anyone have any suggestions? My main issue is that the results have to be based on the key, not the value, e.g. typing "a" could mean a result of "tiddlywinks" for what i'm trying to do here any info would be great, thanks very much


回答1:


First of you set textwatcher for edit text. like urEditText.addTextChangedListener(searchInputTextWatcher);

private TextWatcher searchInputTextWatcher = new TextWatcher() {
    @Override
    public void onTextChanged(CharSequence sequence, int start, int before,
            int count) {
        //Log.i("View adapter    count",String.valueOf(locationViewAdapter.getCount()));
        //if (locationViewAdapter.getCount()>1)
            someAdapter.filterList(sequence);
    }

    @Override
    public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
            int arg3) {
    }

    @Override
    public void afterTextChanged(Editable arg0) {
    }
};

where someAdapter is a your adapter where u implement method filterList(word type in search field)

 public void filterArrayList(CharSequence sequence) {
    if (TextUtils.isEmpty(sequence)) {
        someArrayList = (ArrayList<type>) cloneCategoryArrayList
                .clone();

    } else {
        someArrayList = (ArrayList<type>) cloneCategoryArrayList
                .clone();
        if (!TextUtils.isEmpty(sequence)) {

            List<type> tempCategoryArrayList = new ArrayList<type>(
                    someArrayList);
            for (type obj : tempCategoryArrayList) {
                String typeName = obj.name;

                if (!typename.toLowerCase().startsWith(
                        sequence.toString().toLowerCase(), 0))
                    somearrayList.remove(type);
            }
        }
    }
    notifyDataSetChanged();
}


来源:https://stackoverflow.com/questions/6053383/overriding-filterresults-in-android-autocompletetextview

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!