Updated: 09 April 2013
Tested in:
HTC desire S (android 2.3.5)
Base on:
Eclipse Indigo build in 20120216-1857, Java 1.6, Android 4.1.2
Download Source code:
DemoListViewFilter20130409.rar
Description:
Quick filter in listview by Text in rows.
Screen shot:
Tutorial:
1. Create an adapter implement android.widget.Filterable
public class SimpleAdapter extends BaseAdapter implements Filterable{}
2. Create class SimpleFilter to control the text filterprivate class SimpleFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
// We implement here the filter logic
if (constraint == null || constraint.length() == 0) {
// No filter implemented we return all the list
results.values = mCurrentList;
results.count = mCurrentList.size();
}
else {
// We perform filtering operation
ArrayList<String> nList = new ArrayList<String>();
for (String p : mCurrentList) {
if (p.toUpperCase().indexOf(constraint.toString().toUpperCase()) >= 0)
nList.add(p);
}
results.values = nList;
results.count = nList.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
// Now we have to inform the adapter about the new list filtered
if (results.count == 0)
notifyDataSetInvalidated();
else {
mCurrentList = (ArrayList<String>) results.values;
notifyDataSetChanged();
}
}
}
3. Handle the EditText changing to apply filter rules.editTextFilter.addTextChangedListener(new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
if (s == null || s.length() == 0) {
if (imageButtonResetFilter != null)
imageButtonResetFilter.setVisibility(View.GONE);
} else {
if (imageButtonResetFilter != null)
imageButtonResetFilter.setVisibility(View.VISIBLE);
}
if (count < before) {
simpleAdapter.resetData();
}
simpleAdapter.getFilter().filter(s.toString());
}
@Override
public void beforeTextChanged(CharSequence s, int start, int count,
int after) {
// TODO Auto-generated method stub
}
@Override
public void afterTextChanged(Editable s) {
// TODO Auto-generated method stub
}
});
References:developer.android.com/reference/android/widget/Filterable.html
developer.android.com/reference/android/widget/ListView.html
developer.android.com/reference/android/widget/Adapter.html