aboutsummaryrefslogtreecommitdiffstats
path: root/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java')
-rw-r--r--main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java46
1 files changed, 45 insertions, 1 deletions
diff --git a/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java b/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java
index 952726e..049fc7d 100644
--- a/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java
+++ b/main/src/cgeo/geocaching/activity/AbstractViewPagerActivity.java
@@ -7,8 +7,11 @@ import com.viewpagerindicator.TitlePageIndicator;
import com.viewpagerindicator.TitleProvider;
import org.apache.commons.lang3.tuple.Pair;
+import org.eclipse.jdt.annotation.NonNull;
+import org.eclipse.jdt.annotation.Nullable;
import android.app.Activity;
+import android.os.Bundle;
import android.os.Parcelable;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
@@ -43,6 +46,10 @@ public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends
private final Map<Page, PageViewCreator> viewCreators = new HashMap<Page, PageViewCreator>();
/**
+ * Store the states of the page views to be able to persist them when destroyed and reinstantiated again
+ */
+ private final Map<Page, Bundle> viewStates = new HashMap<Page, Bundle>();
+ /**
* The {@link ViewPager} for this activity.
*/
private ViewPager viewPager;
@@ -76,6 +83,17 @@ public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends
* Handles changed data-sets.
*/
public void notifyDataSetChanged();
+
+ /**
+ * Gets state of the view
+ */
+ public @Nullable
+ Bundle getViewState();
+
+ /**
+ * Set the state of the view
+ */
+ public void setViewState(@NonNull Bundle state);
}
/**
@@ -93,6 +111,19 @@ public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
+
+ final Page page = pageOrder.get(position);
+
+ // Store the state of the view if the page supports it
+ PageViewCreator creator = viewCreators.get(page);
+ if (creator != null) {
+ @Nullable
+ Bundle state = creator.getViewState();
+ if (state != null) {
+ viewStates.put(page, state);
+ }
+ }
+
container.removeView((View) object);
}
@@ -107,6 +138,7 @@ public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends
@Override
public Object instantiateItem(ViewGroup container, int position) {
+
final Page page = pageOrder.get(position);
PageViewCreator creator = viewCreators.get(page);
@@ -114,6 +146,7 @@ public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends
if (null == creator && null != page) {
creator = AbstractViewPagerActivity.this.createViewCreator(page);
viewCreators.put(page, creator);
+ viewStates.put(page, new Bundle());
}
View view = null;
@@ -123,12 +156,18 @@ public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends
// Result from getView() is maybe cached, but it should be valid because the
// creator should be informed about data-changes with notifyDataSetChanged()
view = creator.getView();
+
+ // Restore the state of the view if the page supports it
+ Bundle state = viewStates.get(page);
+ if (state != null) {
+ creator.setViewState(state);
+ }
+
container.addView(view, 0);
}
} catch (Exception e) {
Log.e("ViewPagerAdapter.instantiateItem ", e);
}
-
return view;
}
@@ -225,10 +264,15 @@ public abstract class AbstractViewPagerActivity<Page extends Enum<Page>> extends
protected abstract String getTitle(Page page);
protected final void reinitializeViewPager() {
+
// notify all creators that the data has changed
for (PageViewCreator creator : viewCreators.values()) {
creator.notifyDataSetChanged();
}
+ // reset the stored view states of all pages
+ for (Bundle state : viewStates.values()) {
+ state.clear();
+ }
pageOrder.clear();
final Pair<List<? extends Page>, Integer> pagesAndIndex = getOrderedPages();