Witam.
W moim projekcie mam AutoCompleteTextView, do którego mam podpiętą własną klasę odziedziczoną po ArrayAdapter. Filtrowanie udało mi się zrobić, jednak gdy dodałem sortowanie, ono nie działa.

Kopiuj
public class BusStop extends SugarRecord {
    private String symbol;
    private String name;
    private String latitude;
    private List<BusArrival> items;
    private String longitude;
    private Boolean starred = false;

    public Boolean getStarred() {
        return starred;
    }

    public void setStarred(Boolean starred) {
        this.starred = starred;
    }

    public BusStop() {
    }

    public List<BusArrival> getItems() {
        return items;
    }

    public void setItems(List<BusArrival> items) {
        this.items = items;
    }

    public String getLongitude() {
        return longitude;
    }

    public void setLongitude(String longitude) {
        this.longitude = longitude;
    }

    public String getSymbol() {
        return symbol;
    }

    public void setSymbol(String symbol) {
        this.symbol = symbol;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getLatitude() {
        return latitude;
    }

    public void setLatitude(String latitude) {
        this.latitude = latitude;
    }

    @Override
    public String toString() {
        return symbol + " " + name;
    }
}
Kopiuj
public class BusStopComparator implements Comparator<BusStop> {
    @Override
    public int compare(BusStop lhs, BusStop rhs) {
        if (lhs.getStarred() == rhs.getStarred()) {
            return lhs.toString().compareTo(rhs.toString());
        }
        if (lhs.getStarred()) {
            return 1;
        } else {
            return -1;
        }
    }
}
Kopiuj
public class BusStopFilterableAdapter extends ArrayAdapter<BusStop> {
    public List<BusStop> mData = new ArrayList<BusStop>();
    private Filter mFilter;
    private LayoutInflater mInflater;
    private Activity context;

    public BusStopFilterableAdapter(Activity context) {
        super(context, 0);
        init(context);
        this.context = context;
    }

    public BusStopFilterableAdapter(Activity context, int resource) {
        super(context, resource);
        init(context);
        this.context = context;
    }

    public BusStopFilterableAdapter(Activity context, BusStop[] objects) {
        super(context, 0, objects);
        init(context);
        this.context = context;
    }

    public BusStopFilterableAdapter(Activity context, List<BusStop> objects) {
        super(context, 0, objects);
        init(context);
        this.context = context;
    }

    private void init(Context context) {
        mInflater = LayoutInflater.from(context);
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = context.getLayoutInflater();
        View rowView = inflater.inflate(R.layout.bus_stop_row, null, true);

        TextView busStopNumber = (TextView) rowView.findViewById(R.id.bus_stop_number);
        busStopNumber.setText(this.getItem(position).getSymbol());

        TextView busStopName = (TextView) rowView.findViewById(R.id.bus_stop_name);
        busStopName.setText(this.getItem(position).getName());

        final ImageView iview = (ImageView)rowView.findViewById(R.id.starred);
        iview.setClickable(true);
        if (this.getItem(position).getStarred())
        {
            iview.setImageResource(android.R.drawable.btn_star_big_on);
        } else
        {
            iview.setImageResource(android.R.drawable.btn_star_big_off);
        }
        iview.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                BusStop stop = getItem(position);
                stop.setStarred(!stop.getStarred());
                stop.save();
                if (stop.getStarred())
                {
                    iview.setImageResource(android.R.drawable.btn_star_big_on);
                } else
                {
                    iview.setImageResource(android.R.drawable.btn_star_big_off);
                }
                sort(new BusStopComparator());
            }
        });
        return rowView;
    }

    @Override
    public void sort(Comparator<? super BusStop> comparator) {
        synchronized (mData) {
            Collections.sort(mData, comparator);
        }
        notifyDataSetChanged();
    }

    @Override
    public void add(BusStop object) {
        mData.add(object);
        super.add(object);
    }

    @Override
    public void clear() {
        mData.clear();
        super.clear();
    }

    @Override
    public void addAll(Collection<? extends BusStop> collection) {
        for (BusStop item : collection) {
            mData.add(item);
            super.add(item);
        }
    }

    @Override
    public void addAll(BusStop... items) {
        for (BusStop item : items) {
            mData.add(item);
            super.add(item);
        }
    }

    @Override
    public Filter getFilter() {
        if (mFilter == null)
            mFilter = new Filter() {

                @Override
                protected FilterResults performFiltering(CharSequence query) {
                    FilterResults results = new FilterResults();
                    if (TextUtils.isEmpty(query)) {
                        ArrayList<BusStop> list = new ArrayList<BusStop>(mData);
                        results.values = list;
                        results.count = list.size();
                    } else {
                        ArrayList<BusStop> list = new ArrayList<BusStop>();
                        for (BusStop item : mData) {
                            if (TextUtils.isEmpty(item.getName()))
                                continue;
                            if (item.toString().toLowerCase().contains(query.toString().toLowerCase())) {
                                list.add(item);
                            }

                        }
                        results.values = list;
                        results.count = list.size();
                    }
                    return results;
                }

                @Override
                protected void publishResults(CharSequence query, FilterResults r) {
                    BusStopFilterableAdapter.super.clear();
                    if (r.count > 0) {
                        List<BusStop> values = (List<BusStop>) r.values;
                        for (BusStop value : values) {
                            BusStopFilterableAdapter.super.add(value);
                        }
                        BusStopFilterableAdapter.super.notifyDataSetChanged();
                    } else {
                        BusStopFilterableAdapter.super.notifyDataSetInvalidated();
                    }
                }

            };

        return mFilter;
    }
}

Niedziałanie sortowania objawia się tym, że w wysuniętej liście zmienię dla jakiegoś BusStop wartość starred, to nie jest lista ta sortowana by te z getStarred()==true były na górze. Za pomoc dziękuję