Пользовательская фильтрация для пользовательского ArrayAdapter в ListView
я пишу собственный ArrayAdapter, как этот:
public class PoiListAdapter extends ArrayAdapter implements Filterable {
private Context context;
private final List valuesPoi;
private ItemsFilter mFilter;
public PoiListAdapter(Context context, List 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 getValuesPoi() {
return valuesPoi;
}
public void addValuesPoi(Poi p) {
valuesPoi.add(p);
}
@Override
public void clear() {
valuesPoi.clear();
}
}
Для этого адаптера я хочу реализовать функцию поиска. Поэтому я реализую собственный Filter-Class:
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 filterList = new ArrayList();
if (constraint != null && constraint.toString().length() > 0) {
ArrayList orginalList = new ArrayList(
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 fitems = (ArrayList) results.values;
poiListAdapter.clear();
for (Poi p : fitems) {
poiListAdapter.addValuesPoi(p);
poiListAdapter.notifyDataSetChanged();
}
}
1. Проблема
.... что я получил исключение java.util.concurrentmodification для:
for (Poi p : fitems) {
poiListAdapter.addValuesPoi(p);
poiListAdapter.notifyDataSetChanged();
}
Я думаю, что проблема в том, что я хочу модифицировать Arraylist под доступом. Я думаю, что мне нужно работать с синхронизированным, но я никогда не работал с ним раньше.
ОБНОВИТЬ: Это проблема решена! Вот код:
for(Iterator i = fitems.iterator(); i.hasNext();) {
Poi p = i.next();
poiListAdapter.addValuesPoi(p);
//poiListAdapter.notifyDataSetChanged();
}
2. Проблема
Вид списка пуст при запуске. В начале я хочу показать все элементы! Также ничего не отображается при поиске элемента! Listview пока ничего не показывает!