Benutzerdefinierte Filterung für Custom ArrayAdapter in ListView
Ich schreibe einen eigenen ArrayAdapter wie diesen:
public class PoiListAdapter extends ArrayAdapter<Poi> implements Filterable {
private Context context;
private final List<Poi> valuesPoi;
private ItemsFilter mFilter;
public PoiListAdapter(Context context, List<Poi> valuesPoi) {
super(context, R.layout.poilist);
this.context = context;
this.valuesPoi = valuesPoi;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
View rowView = inflater.inflate(R.layout.poilist, parent, false);
TextView textViewName = (TextView) rowView.findViewById(R.id.name_poi);
TextView textViewDis = (TextView) rowView
.findViewById(R.id.discrip_poi);
textViewName.setText(valuesPoi.get(position).getName());
textViewDis.setText(valuesPoi.get(position).getDiscription());
return rowView;
}
/**
* Implementing the Filterable interface.
*/
public Filter getFilter() {
if (mFilter == null) {
mFilter = new ItemsFilter(this);
}
return mFilter;
}
public List<Poi> getValuesPoi() {
return valuesPoi;
}
public void addValuesPoi(Poi p) {
valuesPoi.add(p);
}
@Override
public void clear() {
valuesPoi.clear();
}
}
Für diesen Adapter möchte ich eine Suchfunktion implementieren. Deshalb implementiere ich eine eigene Filter-Klasse:
public class ItemsFilter extends Filter {
private PoiListAdapter poiListAdapter;
public ItemsFilter(PoiListAdapter poiListAdapter) {
this.poiListAdapter = poiListAdapter;
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
constraint = constraint.toString().toLowerCase();
FilterResults result = new FilterResults();
ArrayList<Poi> filterList = new ArrayList<Poi>();
if (constraint != null && constraint.toString().length() > 0) {
ArrayList<Poi> orginalList = new ArrayList<Poi>(
poiListAdapter.getValuesPoi());
for (Poi p : orginalList) {
if (p.getName().toLowerCase().contains(constraint))
filterList.add(p);
}
Log.i("DEBUG", orginalList.toString());
result.values = filterList;
result.count = filterList.size();
} else {
result.values = poiListAdapter.getValuesPoi();
result.count = poiListAdapter.getValuesPoi().size();
}
return result;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
ArrayList<Poi> fitems = (ArrayList<Poi>) results.values;
poiListAdapter.clear();
for (Poi p : fitems) {
poiListAdapter.addValuesPoi(p);
poiListAdapter.notifyDataSetChanged();
}
}
Das 1. Problem
.... habe ich eine java.util.concurrentmodification-Ausnahme für:
for (Poi p : fitems) {
poiListAdapter.addValuesPoi(p);
poiListAdapter.notifyDataSetChanged();
}
Ich denke, das Problem ist, dass ich eine Arraylist unter Zugriff ändern möchte. Ich denke, ich muss mit synchronisiert arbeiten, aber ich habe noch nie zuvor damit gearbeitet.
AKTUALISIEREN: Das Problem ist gelöst! Hier der Code:
for(Iterator<Poi> i = fitems.iterator(); i.hasNext();) {
Poi p = i.next();
poiListAdapter.addValuesPoi(p);
//poiListAdapter.notifyDataSetChanged();
}
Das 2. Problem
Die Listenansicht ist zu Beginn leer. Zu Beginn möchte ich alle Elemente anzeigen! Auch wird bei der Suche nach einem Element nichts angezeigt! Die Listenansicht zeigt im Moment nichts an!