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.
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;
}
}
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;
}
}
}
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ę