Ошибка при попытке создать настраиваемый массив с фильтром - PullRequest
0 голосов
/ 03 сентября 2011

Я строю секционированный список с фильтром, где при фильтрации заголовки секций остаются в результатах, даже если их секция пуста.Я основал свой код секционированного списка на этой ссылке , и она отлично работает (в конце страницы есть загрузка проекта 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, но я действительно не уверен.

Я загрузил свой проект на эту ссылку и, если мне удастся найти решение, я обновлю его.

Спасибо.

1 Ответ

0 голосов
/ 05 сентября 2011

Черт, я переопределил метод getCount, и он сработал.
Я читал на форуме, они дали этот совет, но я до сих пор не понимаю, когда вызывается этот метод.Если бы кто-нибудь мог ответить мне, я бы хотя бы кое-что узнал из этого.все равно спасибо

А вот ссылка на рабочий код

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...