I am trying to implement a getFilter() on a base adapter to filter out search results on a List. Is there any example of how to implement a getFilter()?
MainActivity
this almost got me killed :)
define an ArrayList of List in your public adapter class which is gonna contain temporary items of your Original List.
public class MyAdapter extends BaseAdapter implements Filterable{
public static ArrayList temporarylist;
public static ArrayList OriginalList;
private Activity activity;
public MyAdapter(Activity activity, ArrayList OriginalList) {
super();
this.activity=activity;
this.OriginalList = OriginalList;
temporarylist=OriginalList;
}
.
.
.
create getFilter() method with the following code[as an example]:
public Filter getFilter() {
Filter filter = new Filter() {
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
temporarylist=(ArrayList)results.values;
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
ArrayList FilteredList= new ArrayList();
if (constraint == null || constraint.length() == 0) {
// No filter implemented we return all the list
results.values = OriginalList;
results.count = OriginalList.size();
}
else {
for (int i = 0; i < OriginalList.size(); i++) {
String data = OriginalList.get(i);
if (data.toLowerCase().contains(constraint.toString())) {
FilteredList.add(data);
}
}
results.values = FilteredList;
results.count = FilteredList.size();
}
return results;
}
};
return filter;
}
And finally in your activity for your EditText:
MyAdapter adapter;
ArrayList items;
ListView list = (ListView) findViewById(R.id.list);
items = new ArrayList();
for (int i=0;i<30;i++){
items.add("Hello world "+String.valueof(i));
}
adapter = new GameAdapter(this, items);
list.setAdapter(adapter);
EditText inputSearch = (EditText) findViewById(R.id.Search_txt);
inputSearch.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) {
// When user changed the Text
MyActivity.this.adapter.getFilter().filter(cs);
}
@Override
public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
int arg3) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable arg0) {
// TODO Auto-generated method stub
}
});