Normally if you have an ArrayAdapter of of a custom type like RowItem
it won't automatically handle filtering for you. After all, how can it know which property of RowItem
to filter? You should override the getFilter
method, and store the filtered list separately from the overall list in your adapter. Something like this:
public class CustomListViewAdapter extends ArrayAdapter<RowItem>
{
private final ArrayList<RowItem> mItems;
private ArrayList<RowItem> mFilteredItems;
private final Comparator<Object> mComparator;
public CustomListViewAdapter(Context context, int textViewResourceId, List<RowItem> items)
{
super(context, textViewResourceId);
mItems = new ArrayList<RowItem>(items);
mFilteredItems = new ArrayList<RowItem>(items);
mComparator = new Comparator<Object>()
{
@Override
public int compare(Object o1, Object o2)
{
String s1 = ((RowItem)o1).getTitle();
String s2 = ((RowItem)o2).getTitle();
return s1.toLowerCase(Locale.getDefault()).compareTo(s2.toLowerCase());
}
};
Collections.sort(mItems, mComparator);
Collections.sort(mFilteredItems, mComparator);
}
@Override
public int getCount()
{
return mFilteredItems.size();
}
@Override
public RowItem getItem(int position)
{
return mFilteredItems.get(position);
}
@Override
public int getPosition(RowItem item)
{
return mFilteredItems.indexOf(item);
}
@Override
public Filter getFilter()
{
return new Filter()
{
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results)
{
mFilteredItems = (ArrayList<RowItem>)results.values;
if (results.count > 0)
{
notifyDataSetChanged();
}
else
{
notifyDataSetInvalidated();
}
}
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
List<RowItem> filteredResults = new ArrayList<RowItem>();
for (RowItem item : mItems)
{
if (item.getTitle().toLowerCase(Locale.getDefault()).contains(constraint.toString().toLowerCase(Locale.getDefault())))
{
filteredResults.add(item);
}
}
Collections.sort(filteredResults, mComparator);
FilterResults results = new FilterResults();
results.values = filteredResults;
results.count = filteredResults.size();
return results;
}
};
}
}
and in MainActivity:
RowItem item = adapter.getItem(position)
r.putExtra("cat_img", item.getImageId());
r.putExtra("cat_id", item.getTermId());
r.putExtra("cat_id2", item.getTermId());
r.putExtra("cat_name", item.getTitle());
You Also have to add a termid field to RowItem, since it's in your JSON response...