Skip to content

Instantly share code, notes, and snippets.

@evant
Last active August 29, 2015 14:26
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save evant/57650ae1d793e0d9e3be to your computer and use it in GitHub Desktop.
Save evant/57650ae1d793e0d9e3be to your computer and use it in GitHub Desktop.
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.LoaderManager;
import android.support.v4.content.Loader;
/**
* Abuse loaders to retain some state across rotations for a Fragment or Activity.
*/
public class RetainStateManager {
private Context context;
private LoaderManager loaderManager;
public RetainStateManager(Context context, LoaderManager loaderManager) {
this.context = context;
this.loaderManager = loaderManager;
}
public <T> T get(int id, final OnCreate<T> onCreate) {
RetainStateLoader<T> loader = (RetainStateLoader<T>) loaderManager.initLoader(id, null, new LoaderManager.LoaderCallbacks<T>() {
@Override
public Loader<T> onCreateLoader(int id, Bundle args) {
RetainStateLoader<T> loader = new RetainStateLoader<>(context);
loader.setState(onCreate.onCreate());
return loader;
}
@Override
public void onLoadFinished(Loader<T> loader, T data) {
}
@Override
public void onLoaderReset(Loader<T> loader) {
}
});
return loader.getState();
}
public interface OnCreate<T> {
T onCreate();
}
private static class RetainStateLoader<T> extends Loader<T> {
private T state;
public RetainStateLoader(Context context) {
super(context);
}
T getState() {
return state;
}
void setState(T state) {
this.state = state;
}
}
}
@evant
Copy link
Author

evant commented Aug 5, 2015

RetainStateManager manager = new RetainStateManager(getActivity(), getLoaderManager());
Foo foo = manager.get(0, new RetainStateManager.OnCreate<Foo>() {
  @Override
  public Foo onCreate() {
    return new Foo();
  }
});

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment