Как мне снова заполнить мой список при удалении ограничения фильтра - PullRequest
2 голосов
/ 23 июня 2011

Я реализовал пользовательский адаптер списка и пользовательский фильтр.Я дошел до того, что смог отфильтровать свой список, набрав, однако, когда я удаляю свои ограничения, список не заполняется снова.Я использовал эти два источника, чтобы добраться туда, где я нахожусь.http://www.google.com/codesearch/p?hl=it#uX1GffpyOZk/core/java/android/widget/ArrayAdapter.java&q=android%20arrayadapter&sa=N&cd=1&ct=rc

и Пользовательская фильтрация в Android с помощью ArrayAdapter

Я заблудился, что делать дальше.Это мой код:

private class stationAdapter extends ArrayAdapter<Station>
{

    //======================================
    public ArrayList<Station> stations;
    public ArrayList<Station> filtered;
    private Filter filter;
    //=====================

    public stationAdapter(Context context, int textViewResourceId, ArrayList<Station> stations)
    {
        super(context, textViewResourceId, stations);
        this.filtered = stations;
        this.stations = filtered;
        this.filter = new StationFilter();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        View v = convertView;
        if (v == null)
        {
            LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.row, null);
        }
        Station temp = stations.get(position);

        if (temp != null)
        {
            TextView stationName = (TextView) v.findViewById(R.id.stationname);
            TextView serviced = (TextView) v.findViewById(R.id.inservice);

            try
            {
                if (temp.isRedLine())
                {
                    // v.setBackgroundResource(R.color.red);
                    ImageView imageView = (ImageView) v.findViewById(R.id.icon);
                    imageView.setImageResource(R.drawable.redstation);
                    v.setBackgroundResource(temp.getAreaColour());
                }
                else
                {
                    ImageView imageView = (ImageView) v.findViewById(R.id.icon);
                    imageView.setImageResource(R.drawable.greenstation);

                    v.setBackgroundResource(temp.getAreaColour());
                }
            }
            catch (Exception e)
            {
                Log.d(TAG, "Null pointer");
            }
            if (stationName != null)
            {
                stationName.setText(temp.getName());
            }
            if (serviced != null)
            {
                serviced.setText(temp.getIrishName());
            }
        }
        return v;
    }

    //=====================================

    @Override
    public Filter getFilter()
    {
        if(filter == null)
            filter = new StationFilter();
        return filter;
    }

    private class StationFilter extends Filter
    {

        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            // NOTE: this function is *always* called from a background thread, and
            // not the UI thread.
            constraint = constraint.toString().toLowerCase();
            FilterResults result = new FilterResults();

            if(constraint != null && constraint.toString().length() > 0)
            {
                ArrayList<Station> filt = new ArrayList<Station>();
                ArrayList<Station> lItems = new ArrayList<Station>();
                synchronized (this)
                {
                    lItems.addAll(stations);
                }
                for(int i = 0, l = lItems.size(); i < l; i++)
                {
                    Station m = lItems.get(i);
                    if(m.getName().toLowerCase().startsWith((String) constraint))
                    {
                        filt.add(m);
                    }
                }
                result.count = filt.size();
                result.values = filt;
            }
            else
            {
                synchronized(this)
                {
                    result.values = stations;
                    result.count = stations.size();
                }
            }
            return result;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            // NOTE: this function is *always* called from the UI thread.
            filtered = (ArrayList<Station>)results.values;
            notifyDataSetChanged();
            clear();
            for(int i = 0, l = filtered.size(); i < l; i++){
                add(filtered.get(i));
            }
            notifyDataSetInvalidated();
        }

    }
    //===================================================

}

Нужно ли переопределять больше методов из Filterable или мне нужно что-то делать с моими представлениями?

Любая помощь будет принята с благодарностью.

Ответы [ 2 ]

2 голосов
/ 28 июня 2011
        protected void cloneItems(ArrayList<Station> items) {
        for (Iterator<Station> iterator = items.iterator(); iterator
        .hasNext();) {
            Station s = (Station) iterator.next();
            originalItems.add(s);
        }
    }

Это ключ к работе фильтра. Вызовите clone в конструкторе с переданным списком, и фильтр заработает.

Кредит идет к первому ответу в этом посте: Как написать собственный фильтр для ListView с ArrayAdapter

0 голосов
/ 23 июня 2011

Обычно вы должны вызывать notifyDataSetChanged после всех изменений. И вы называете недействительным. У этой темы, кажется, есть хорошее объяснение. Адаптер ListView для Android notifyDataSetInvalidated () против notifyDataSetChanged ()

Кроме того, я не думаю, что вам нужно notifyDataSetChanged до clear.

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