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 res开发者_如何学Cults) {
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
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();
}
精彩评论