Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

overriding filterresults in android autocompletetextview?

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

like image 713
blackbourna Avatar asked Nov 05 '22 21:11

blackbourna


1 Answers

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();
}
like image 71
Krishna Shrestha Avatar answered Nov 14 '22 21:11

Krishna Shrestha