aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--main/src/cgeo/geocaching/cgeocaches.java6
-rw-r--r--main/src/cgeo/geocaching/sorting/DistanceComparator.java18
-rw-r--r--main/src/cgeo/geocaching/sorting/InverseComparator.java22
-rw-r--r--main/src/cgeo/geocaching/ui/CacheListAdapter.java22
4 files changed, 63 insertions, 5 deletions
diff --git a/main/src/cgeo/geocaching/cgeocaches.java b/main/src/cgeo/geocaching/cgeocaches.java
index d4802ed..97f8ceb 100644
--- a/main/src/cgeo/geocaching/cgeocaches.java
+++ b/main/src/cgeo/geocaching/cgeocaches.java
@@ -242,7 +242,8 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
}
activity.handleCachesLoaded();
}
- };
+ }
+
private Handler loadNextPageHandler = new Handler() {
@Override
@@ -912,7 +913,8 @@ public class cgeocaches extends AbstractListActivity implements FilteredActivity
/**
* called from the filter bar view
*/
- public void showFilterMenu(@SuppressWarnings("unused") final View view) {
+ @Override
+ public void showFilterMenu(final View view) {
new FilterUserInterface(this).selectFilter(new RunnableWithArgument<IFilter>() {
@Override
public void run(IFilter selectedFilter) {
diff --git a/main/src/cgeo/geocaching/sorting/DistanceComparator.java b/main/src/cgeo/geocaching/sorting/DistanceComparator.java
index d601433..781359a 100644
--- a/main/src/cgeo/geocaching/sorting/DistanceComparator.java
+++ b/main/src/cgeo/geocaching/sorting/DistanceComparator.java
@@ -11,8 +11,22 @@ import java.util.List;
*/
public class DistanceComparator extends AbstractCacheComparator {
+ final private Geopoint coords;
+ final private List<cgCache> list;
+ private boolean cachedDistances;
+
public DistanceComparator(final Geopoint coords, List<cgCache> list) {
- // calculate all distances to avoid duplicate calculations during sorting
+ this.coords = coords;
+ this.list = list;
+ }
+
+ /**
+ * calculate all distances only once to avoid costly re-calculation of the same distance during sorting
+ */
+ private void calculateAllDistances() {
+ if (cachedDistances) {
+ return;
+ }
for (cgCache cache : list) {
if (cache.getCoords() != null) {
cache.setDistance(coords.distanceTo(cache.getCoords()));
@@ -21,6 +35,7 @@ public class DistanceComparator extends AbstractCacheComparator {
cache.setDistance(null);
}
}
+ cachedDistances = true;
}
@Override
@@ -30,6 +45,7 @@ public class DistanceComparator extends AbstractCacheComparator {
@Override
protected int compareCaches(final cgCache cache1, final cgCache cache2) {
+ calculateAllDistances();
if (cache1.getCoords() == null && cache2.getCoords() == null) {
return 0;
}
diff --git a/main/src/cgeo/geocaching/sorting/InverseComparator.java b/main/src/cgeo/geocaching/sorting/InverseComparator.java
new file mode 100644
index 0000000..d2fa085
--- /dev/null
+++ b/main/src/cgeo/geocaching/sorting/InverseComparator.java
@@ -0,0 +1,22 @@
+package cgeo.geocaching.sorting;
+
+import cgeo.geocaching.cgCache;
+
+/**
+ * comparator which inverses the sort order of the given other comparator
+ *
+ */
+public class InverseComparator implements CacheComparator {
+
+ private final CacheComparator originalComparator;
+
+ public InverseComparator(CacheComparator comparator) {
+ this.originalComparator = comparator;
+ }
+
+ @Override
+ public int compare(cgCache lhs, cgCache rhs) {
+ return originalComparator.compare(rhs, lhs);
+ }
+
+}
diff --git a/main/src/cgeo/geocaching/ui/CacheListAdapter.java b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
index a2221c9..00906b6 100644
--- a/main/src/cgeo/geocaching/ui/CacheListAdapter.java
+++ b/main/src/cgeo/geocaching/ui/CacheListAdapter.java
@@ -12,6 +12,7 @@ import cgeo.geocaching.filter.IFilter;
import cgeo.geocaching.geopoint.Geopoint;
import cgeo.geocaching.sorting.CacheComparator;
import cgeo.geocaching.sorting.DistanceComparator;
+import cgeo.geocaching.sorting.InverseComparator;
import cgeo.geocaching.sorting.VisitComparator;
import cgeo.geocaching.utils.AngleUtils;
import cgeo.geocaching.utils.Log;
@@ -43,6 +44,7 @@ import android.widget.TextView;
import java.util.ArrayList;
import java.util.Collections;
+import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Set;
@@ -64,6 +66,7 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
final private Resources res;
/** Resulting list of caches */
final private List<cgCache> list;
+ private boolean inverseSort = false;
private static final int SWIPE_MIN_DISTANCE = 60;
private static final int SWIPE_MAX_OFF_PATH = 100;
@@ -149,6 +152,14 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
* @param comparator
*/
public void setComparator(final CacheComparator comparator) {
+ // selecting the same sorting twice will toggle the order
+ if (cacheComparator != null && comparator != null && cacheComparator.getClass() == comparator.getClass()) {
+ inverseSort = !inverseSort;
+ }
+ else {
+ // always reset the inversion for a new sorting criteria
+ inverseSort = false;
+ }
cacheComparator = comparator;
forceSort();
}
@@ -257,7 +268,7 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
updateSortByDistance();
}
else {
- Collections.sort(list, cacheComparator);
+ Collections.sort(list, getPotentialInversion(cacheComparator));
}
notifyDataSetChanged();
@@ -292,7 +303,7 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
return;
}
final ArrayList<cgCache> oldList = new ArrayList<cgCache>(list);
- Collections.sort(list, new DistanceComparator(coords, list));
+ Collections.sort(list, getPotentialInversion(new DistanceComparator(coords, list)));
// avoid an update if the list has not changed due to location update
if (list.equals(oldList)) {
@@ -302,6 +313,13 @@ public class CacheListAdapter extends ArrayAdapter<cgCache> {
lastSort = System.currentTimeMillis();
}
+ private Comparator<? super cgCache> getPotentialInversion(final CacheComparator comparator) {
+ if (inverseSort) {
+ return new InverseComparator(comparator);
+ }
+ return comparator;
+ }
+
private boolean isSortedByDistance() {
return cacheComparator == null || cacheComparator instanceof DistanceComparator;
}