Фильтрация кастомного ListView из SearchView
Мучаю вторые сутки фильтрацию из SearchView (actionbar) в кастомном ListView по полю Zakazchik.getName()... на третьи сутки чувствую не хватит нервов :) Молю о помощи :)
Имеется:
public class MainActivity extends Activity implements SearchView.OnQueryTextListener{
private ListView list; // ListView
private ArrayAdapter<Zakazchik> adapter; // Адаптер для наполнения ListView
private List<Zakazchik> listZakazchik; // Лист объектов для наполнения через адаптер
// Переопределяем методы SearchView.OnQueryTextListener
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
// Переопределяем методы SearchView.OnQueryTextListener
@Override
public boolean onQueryTextChange(String newText) {
adapter.getFilter().filter(newText);
return true;
}
...
adapter = new MyListAdapter();
list = (ListView) findViewById(R.id.listViewAllCategory);
list.setAdapter(adapter);
list.setTextFilterEnabled(true); // указываем ListView на то, что он фильтруется
}
Класс Zakazchik:
public class Zakazchik {
private String id;
private String avatarUrl;
private String subcategory;
private String name;
Zakazchik(String id, String avatarUrl, String subcategory, String name){
this.id = id;
this.avatarUrl = avatarUrl;
this.subcategory = subcategory;
this.name = name;
}
// Геттеры, сеттеры ...
}
Адаптер с фильтром:
public class MyListAdapter extends ArrayAdapter<Zakazchik> implements Filterable {
public MyListAdapter() {
super(MainActivity.this, R.layout.zakazchik, listZakazchik);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View itemView = convertView;
if (itemView == null) {
itemView = getLayoutInflater().inflate(R.layout.zakazchik, parent, false);
}
//Находим заказчика
Zakazchik currentZakazchik = listZakazchik.get(position);
//Показываем аватарку (avatarUrl)
ImageView imageView = (ImageView) itemView.findViewById(R.id.item_photo);
ImageLoader imageLoader = ImageLoader.getInstance();
imageLoader.displayImage(currentZakazchik.getAvatarUrl(), imageView);
//Показываем имя заказчика (name)
TextView nameText = (TextView) itemView.findViewById(R.id.item_name);
nameText.setText(currentZakazchik.getName());
//Показываем название подкатегории (subcategory)
tv_item_subcategory.setText(currentZakazchik.getSubcategory());
return itemView;
}
//***************ФИЛЬТР
@Override
public Filter getFilter() {
Filter filter = new Filter() {
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults result = new FilterResults();
List<Zakazchik> allZakazchik = listZakazchik;
if(constraint == null || constraint.length() == 0){
result.values = allZakazchik;
result.count = allZakazchik.size();
}else{
ArrayList<Zakazchik> filteredList = new ArrayList<Zakazchik>();
for(Zakazchik j: allZakazchik){
if(j.getName().contains(constraint))
filteredList.add(j);
}
result.values = filteredList;
result.count = filteredList.size();
}
return result;
}
@SuppressWarnings("unchecked")
@Override
protected void publishResults(CharSequence constraint, FilterResults results){
if (results.count == 0) {
notifyDataSetChanged();
} else {
listZakazchik = (ArrayList<Zakazchik>) results.values;
notifyDataSetChanged();
}
}
};
return filter;
}
}
В ActionBar установлен SearchView: app:actionViewClass="android.widget.SearchView"
В MainActivity в onCreateOptionsMenu(Menu menu) определен SearchView со слушателем нажатий:
@Override
public boolean onCreateOptionsMenu(Menu menu) {
...
MenuItem searchMenuItem = menu.findItem(R.id.menuSearch);
SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchMenuItem);
searchView.setOnQueryTextListener(this);
...
}
Ругается на строчку
Zakazchik currentZakazchik = listZakazchik.get(position);
java.lang.IndexOutOfBoundsException: Invalid index 4, size is 4
ps. Было замечено, что при попытке ввести в SearchView букву (например О), ListView успевает до вылета приложения отфильтровать себя по этой букве... отображает имена, в которых эта О содержится... и сразу вылетает.