How to implement Filter in a Custom ArrayList using EditText, I am parsing JSON data into ListView using an ArrayList.
I would like to allow user to filter records using Person Name or City in EditText
public class Persons {
private String name;
private String city;
.......
// getters and setters
}
PersonsAdapter.java:
public class PersonsAdapter extends BaseAdapter implements Filterable {
ArrayList<Persons> arrayList;
ArrayList<Persons> filteredItems;
LayoutInflater inflater;
int Resource;
ViewHolder holder;
Context context;
private ItemFilter mFilter = new ItemFilter();
public PersonsAdapter(Context context, int resource, ArrayList<Persons> arrayList) {
this.context = context;
this.inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
this.Resource = resource;
this.arrayList = arrayList;
this.filteredItems = arrayList;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// convert view = design
View view = convertView;
if (view == null) {
holder = new ViewHolder();
view = inflater.inflate(Resource, null);
holder.textName = (TextView) view.findViewById(R.id.textName);
holder.textCity = (TextView) view.findViewById(R.id.textCity);
view.setTag(holder);
}
else
{
holder = (ViewHolder) view.getTag();
}
holder.textName.setText(arrayList.get(position).getName());
holder.textCity.setText(arrayList.get(position).getCity());
return view;
}
static class ViewHolder {
TextView textName;
TextView textCity;
}
public Filter getFilter() {
return mFilter;
}
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults result = new FilterResults();
filteredItems = new ArrayList<Persons>();
if (constraint != null && constraint.toString().length() > 0) {
for (int i = 0, l = arrayList.size(); i < l; i++) {
Persons person = arrayList.get(i);
// here check with your property
if (person.getName().toLowerCase().contains(constraint))
filteredItems.add(person);
}
result.count = filteredItems.size();
result.values = filteredItems;
} else {
synchronized (this) {
result.values = arrayList;
result.count = arrayList.size();
}
}
return result;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
filteredItems = (ArrayList<Persons>) results.values;
notifyDataSetChanged();
}
}
@Override
public int getCount() {
// TODO Auto-generated method stub
return arrayList.size();
}
@Override
public Object getItem(int position) {
// TODO Auto-generated method stub
return arrayList.get(position);
}
@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}
}
Try to use below code to solve your problem and learn for correct implementation for Filterable
interface
Replace below line from your existing code not to instantiate every time
private ItemFilter mFilter = new ItemFilter();
To
private ItemFilter mFilter;
private class ItemFilter extends Filter {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if (constraint != null && constraint.length() > 0) {
ArrayList<Persons> filterList = new ArrayList<Persons>();
for (int i = 0; i < filteredItems.size(); i++) {
Persons person = filteredItems.get(i);
String name = person.getName().toUpperCase();
String city = person.getCity().toUpperCase();
if (name.contains(constraint.toString().toUpperCase()) || city.contains(constraint.toString().toUpperCase())) {
filterList.add(person);
}
}
results.count = filterList.size();
results.values = filterList;
} else {
results.count = filteredItems.size();
results.values = filteredItems;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
arrayList = (ArrayList<Persons>) results.values;
notifyDataSetChanged();
}
}
public Filter getFilter() {
if (itemFilter == null) {
itemFilter = new ItemFilter();
}
return itemFilter;
}
@Override
public long getItemId(int position) {
return arrayList.indexOf(getItem(position));
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.