Android 尝试使用筛选器执行自定义arraylist时出错

Android 尝试使用筛选器执行自定义arraylist时出错,android,list,filter,Android,List,Filter,我正在用过滤器构建一个分区列表,在这里,当我过滤时,分区标题保留在结果中,即使它们的分区是空的。 我基于我的分区列表代码,它工作得很好(在页面的最后有一个eclipse项目的下载),我从这段代码中复制了布局文件和getView()函数,当我运行代码时,一切正常,当我使用空搜索进行筛选时,它也工作得很好,但是,当我尝试使用任何实际更改列表的内容进行筛选时,会出现错误,程序将关闭。 我的代码如下: public class ListaCustom extends ArrayAdapter<It

我正在用过滤器构建一个分区列表,在这里,当我过滤时,分区标题保留在结果中,即使它们的分区是空的。 我基于我的分区列表代码,它工作得很好(在页面的最后有一个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();
            }
        }

    }

}
公共类ListaCustom扩展ArrayAdapter实现可过滤{
私人清单项目;
私有过滤器=空;
私有最终对象mLock=新对象();
私人ArrayList mOriginalValues;
私人停车场6号;
私有int mFieldId=0;
public ListaCustom(上下文、int textViewResourceId、ArrayList对象){
超级(上下文、textViewResourceId、对象);
项目=对象;
vi=(LayoutInflater)context.getSystemService(context.LAYOUT\u充气机\u服务);
}
公共void addItemNormal(字符串名称){
添加(新项目正常(nome));
};
公共无效addSecao(字符串名称){
增加(新Secao(nome));
};
公用项目获取(int pos){
返回项目。获取(pos);
};
公共整数大小(){
返回items.size();
};
公共视图getView(int位置、视图转换视图、视图组父视图){
视图v=转换视图;
最终项目i=项目。获取(位置);
if(i.isSection()){
Secao si=(Secao)i;
v=vi.充气(R.布局.列表项目部分,空);
v、 setOnClickListener(空);
v、 setOnLongClickListener(空);
v、 设置长点击(假);
最终文本视图部分视图=(文本视图)v.findViewById(R.id.list\u item\u section\u text);
sectionView.setText(si.getNome());
}否则{
ItemNormal ei=(ItemNormal)i;
v=vi.充气(R.布局.列表项目输入,空);
最终文本视图标题=(文本视图)v.findViewById(R.id.list\u item\u entry\u title);
如果(标题!=null)
title.setText(ei.getNome());
}
返回v;
}
@凌驾
公共过滤器getFilter()
{
if(filter==null)
过滤器=新的myFilter();
回流过滤器;
}
私有类myFilter扩展了过滤器{
@凌驾
受保护的筛选器结果执行筛选(字符序列前缀){
FilterResults results=新的FilterResults();
if(mOriginalValues==null){
已同步(mLock){
mOriginalValues=新阵列列表(项目);
}
}
if(prefix==null | | prefix.length()==0){
已同步(mLock){
ArrayList=新的ArrayList(MoriginalValue);
结果.值=列表;
results.count=list.size();
}
}否则{
字符串prefixString=prefix.toString().toLowerCase();
最终ArrayList值=MoriginalValue;
最终整数计数=values.size();
最终ArrayList newValues=新ArrayList(计数);
for(int i=0;i0){
notifyDataSetChanged();
}否则{
notifyDataSetionValidated();
}
}
}
}
由于我来自巴西,葡萄牙语中有一些方法和变量,因此,我只想提供一点帮助: 项-抽象类 ItemNormal-扩展项,是常规项 secao-扩展项,是节项 getNome()-返回项文本

我不知道这有什么问题,我开始认为这与getView有关,但我真的不确定

我已将我的项目上载到,如果我设法获得解决方案,我将更新它


谢谢。

该死的,我重写了getCount方法,它成功了
我在一个论坛上读到,他们给出了这个建议,但我仍然不明白这个方法是什么时候调用的。如果有人能回答我,我至少会从中学到一些东西。 无论如何谢谢你

这里是