diff options
| author | Samuel Tardieu <sam@rfc1149.net> | 2014-03-27 00:00:06 +0100 |
|---|---|---|
| committer | Samuel Tardieu <sam@rfc1149.net> | 2014-03-27 00:06:07 +0100 |
| commit | 4bbf0552602243cf82ad62da41593d430e03bbbc (patch) | |
| tree | cae53c2cda4257433649e2a40a3daa386d69f704 /main/src | |
| parent | 797c0684f65059e947992945358aac2f25b58218 (diff) | |
| download | cgeo-4bbf0552602243cf82ad62da41593d430e03bbbc.zip cgeo-4bbf0552602243cf82ad62da41593d430e03bbbc.tar.gz cgeo-4bbf0552602243cf82ad62da41593d430e03bbbc.tar.bz2 | |
Handle history list differently than other lists
History list cannot be sorted. Using the same comparator as other lists
will make us lose the chosen sorting order (see #3519).
Diffstat (limited to 'main/src')
4 files changed, 30 insertions, 31 deletions
diff --git a/main/src/cgeo/geocaching/CacheListActivity.java b/main/src/cgeo/geocaching/CacheListActivity.java index 7f43d63..510dfbe 100644 --- a/main/src/cgeo/geocaching/CacheListActivity.java +++ b/main/src/cgeo/geocaching/CacheListActivity.java @@ -662,7 +662,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA showFilterMenu(null); return true; case R.id.menu_sort: - final CacheComparator oldComparator = CacheListAdapter.getCacheComparator(); + final CacheComparator oldComparator = adapter.getCacheComparator(); new ComparatorUserInterface(this).selectComparator(oldComparator, new Action1<CacheComparator>() { @Override public void call(CacheComparator selectedComparator) { @@ -1644,7 +1644,7 @@ public class CacheListActivity extends AbstractListActivity implements FilteredA cacheList.addAll(cachesFromSearchResult); search = searchIn; adapter.reFilter(); - adapter.setInitialComparator(); + adapter.checkEvents(); adapter.forceSort(); adapter.notifyDataSetChanged(); updateTitle(); diff --git a/main/src/cgeo/geocaching/sorting/EventDateComparator.java b/main/src/cgeo/geocaching/sorting/EventDateComparator.java index e4649c8..197946a 100644 --- a/main/src/cgeo/geocaching/sorting/EventDateComparator.java +++ b/main/src/cgeo/geocaching/sorting/EventDateComparator.java @@ -5,4 +5,6 @@ package cgeo.geocaching.sorting; */ public class EventDateComparator extends DateComparator { + final static public EventDateComparator singleton = new EventDateComparator(); + } diff --git a/main/src/cgeo/geocaching/sorting/VisitComparator.java b/main/src/cgeo/geocaching/sorting/VisitComparator.java index 1589a4c..cee0633 100644 --- a/main/src/cgeo/geocaching/sorting/VisitComparator.java +++ b/main/src/cgeo/geocaching/sorting/VisitComparator.java @@ -8,6 +8,8 @@ import cgeo.geocaching.Geocache; */ public class VisitComparator extends AbstractCacheComparator { + final static public VisitComparator singleton = new VisitComparator(); + @Override protected int compareCaches(final Geocache cache1, final Geocache cache2) { return Long.valueOf(cache2.getVisitedDate()).compareTo(cache1.getVisitedDate()); diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java index 90d603c..ca4e825 100644 --- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java +++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java @@ -70,6 +70,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { final private Resources res; /** Resulting list of caches */ final private List<Geocache> list; + private boolean eventsOnly; private boolean inverseSort = false; private static final int SWIPE_MIN_DISTANCE = 60; @@ -122,9 +123,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { this.res = activity.getResources(); this.list = list; this.cacheListType = cacheListType; - if (cacheListType == CacheListType.HISTORY) { - cacheComparator = new VisitComparator(); - } + checkEvents(); final Drawable modifiedCoordinatesMarker = activity.getResources().getDrawable(R.drawable.marker_usermodifiedcoords); for (final CacheType cacheType : CacheType.values()) { @@ -170,10 +169,20 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { inverseSort = !inverseSort; } - public static CacheComparator getCacheComparator() { + public CacheComparator getCacheComparator() { + if (isHistory()) { + return VisitComparator.singleton; + } + if (cacheComparator == null && eventsOnly) { + return EventDateComparator.singleton; + } return cacheComparator; } + private boolean isHistory() { + return cacheListType == CacheListType.HISTORY; + } + public Geocache findCacheByGeocode(String geocode) { for (int i = 0; i < getCount(); i++) { if (getItem(i).getGeocode().equalsIgnoreCase(geocode)) { @@ -274,7 +283,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { updateSortByDistance(); } else { - Collections.sort(list, getPotentialInversion(cacheComparator)); + Collections.sort(list, getPotentialInversion(getCacheComparator())); } notifyDataSetChanged(); @@ -326,8 +335,9 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { return comparator; } - private static boolean isSortedByDistance() { - return cacheComparator == null || cacheComparator instanceof DistanceComparator; + private boolean isSortedByDistance() { + final CacheComparator comparator = getCacheComparator(); + return comparator == null || comparator instanceof DistanceComparator; } public void setActualHeading(final float direction) { @@ -481,7 +491,7 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { } holder.favorite.setBackgroundResource(favoriteBack); - if (cacheListType == CacheListType.HISTORY && cache.getVisitedDate() > 0) { + if (isHistory() && cache.getVisitedDate() > 0) { holder.info.setText(Formatter.formatCacheInfoHistory(cache)); } else { holder.info.setText(Formatter.formatCacheInfoLong(cache, cacheListType)); @@ -644,28 +654,13 @@ public class CacheListAdapter extends ArrayAdapter<Geocache> { return list.size(); } - public void setInitialComparator() { - // will be called repeatedly when coming back to the list, therefore check first for an already existing sorting - if (cacheComparator != null) { - return; - } - CacheComparator comparator = null; // a null comparator will automatically sort by distance - if (cacheListType == CacheListType.HISTORY) { - comparator = new VisitComparator(); - } else { - if (CollectionUtils.isNotEmpty(list)) { - boolean eventsOnly = true; - for (final Geocache cache : list) { - if (!cache.isEventCache()) { - eventsOnly = false; - break; - } - } - if (eventsOnly) { - comparator = new EventDateComparator(); - } + public void checkEvents() { + eventsOnly = true; + for (final Geocache cache : list) { + if (!cache.isEventCache()) { + eventsOnly = false; + return; } } - setComparator(comparator); } } |
