Я строю секционированный список с фильтром, где при фильтрации заголовки секций остаются в результатах, даже если их секция пуста.Я основал свой код секционированного списка на этой ссылке , и она отлично работает (в конце страницы есть загрузка проекта eclipse), я скопировал файлы макета и функцию getView () из этогокод, и когда я запускаю код, все в порядке, когда я фильтрую с пустым поиском, он также работает нормально, но когда я пытаюсь фильтровать с чем-то, что фактически меняет список, я получаю сообщение об ошибке, и программа закрывается.Мой код ниже:
public class ListaCustom extends ArrayAdapter<Item> implements Filterable{
private List<Item> items;
private Filter filter= null;
private final Object mLock = new Object();
private ArrayList<Item> mOriginalValues;
private LayoutInflater vi;
private int mFieldId = 0;
public ListaCustom(Context context, int textViewResourceId, ArrayList<Item> objects) {
super(context, textViewResourceId, objects);
items = objects;
vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
public void addItemNormal(String nome){
items.add(new ItemNormal(nome));
};
public void addSecao(String nome){
items.add(new Secao(nome));
};
public Item get(int pos){
return items.get(pos);
};
public int size(){
return items.size();
};
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
final Item i = items.get(position);
if(i.isSection()){
Secao si = (Secao)i;
v = vi.inflate(R.layout.list_item_section, null);
v.setOnClickListener(null);
v.setOnLongClickListener(null);
v.setLongClickable(false);
final TextView sectionView = (TextView) v.findViewById(R.id.list_item_section_text);
sectionView.setText(si.getNome());
}else{
ItemNormal ei = (ItemNormal)i;
v = vi.inflate(R.layout.list_item_entry, null);
final TextView title = (TextView)v.findViewById(R.id.list_item_entry_title);
if (title != null)
title.setText(ei.getNome());
}
return v;
}
@Override
public Filter getFilter()
{
if(filter == null)
filter = new myFilter();
return filter;
}
private class myFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence prefix) {
FilterResults results = new FilterResults();
if (mOriginalValues == null) {
synchronized (mLock) {
mOriginalValues = new ArrayList<Item>(items);
}
}
if (prefix == null || prefix.length() == 0) {
synchronized (mLock) {
ArrayList<Item> list = new ArrayList<Item>(mOriginalValues);
results.values = list;
results.count = list.size();
}
} else {
String prefixString = prefix.toString().toLowerCase();
final ArrayList<Item> values = mOriginalValues;
final int count = values.size();
final ArrayList<Item> newValues = new ArrayList<Item>(count);
for (int i = 0; i < count; i++) {
final Item value = values.get(i);
final String valueText = value.getNome().toLowerCase();
// First match against the whole, non-splitted value
if (value.isSection()) {
newValues.add(value);
}
else {
if (valueText.contains(prefixString)) {
newValues.add(value);
}
}
}
results.values = newValues;
results.count = newValues.size();
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
//noinspection unchecked
Log.v("count", results.count+"");
items = (List<Item>) results.values;
if (results.count > 0) {
notifyDataSetChanged();
} else {
notifyDataSetInvalidated();
}
}
}
}
Поскольку я из Бразилии, на португальском языке есть некоторые методы и переменные, поэтому, чтобы немного помочь: Item - абстрактный класс ItemNormal - расширяет Item, является обычным элементомsecao - расширяет Item, является разделом элемента getNome () - возвращает текст элемента
Я не представляю, что с этим не так, я начинаю думать, что что-то делать сgetView, но я действительно не уверен.
Я загрузил свой проект на эту ссылку и, если мне удастся найти решение, я обновлю его.
Спасибо.