Forked from curioustechizen/StateSavingArrayAdapter.java
Last active
August 29, 2015 14:07
-
-
Save aftabsikander/6e7eb6710cdee2920af3 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* <p> | |
* An {@code ArrayAdapter} that also knows how to save and restore its state. | |
* Basically all it does is save/restore the array of objects being managed by | |
* the Adapter. | |
* </p> | |
* | |
* <p> | |
* Note that this only saves the items and not things like checked item | |
* positions. Those belong to the {@link ListView} itself. Consider using | |
* {@link ListView#onSaveInstanceState()} and | |
* {@link ListView#onRestoreInstanceState(Parcelable)} for this purpose. | |
* </p> | |
* | |
* | |
* @author Kiran Rao | |
* | |
* @param <T> | |
* The type of objects managed by this Adapter. Note that it must be a | |
* Parcelable. | |
*/ | |
public class StateSavingArrayAdapter<T extends Parcelable> extends | |
ArrayAdapter<T> { | |
private static final String KEY_ADAPTER_STATE = "StateSavingArrayAdapter.KEY_ADAPTER_STATE"; | |
/** | |
* Saves the instance state of this {@link ArrayAdapter}. It saves the array | |
* of currently managed by this adapter | |
* | |
* @param outState | |
* The bundle into which the state is saved | |
*/ | |
public void onSaveInstanceState(Bundle outState) { | |
outState.putParcelableArrayList(KEY_ADAPTER_STATE, getAllItems()); | |
} | |
/** | |
* Restore the instance state of the {@link ArrayAdapter}. It re-initializes | |
* the array of objects being managed by this adapter with the state retrieved | |
* from {@code savedInstanceState} | |
* | |
* @param savedInstanceState | |
* The bundle containing the previously saved state | |
*/ | |
public void onRestoreInstanceState(Bundle savedInstanceState) { | |
if (savedInstanceState.containsKey(KEY_ADAPTER_STATE)) { | |
ArrayList<T> objects = savedInstanceState | |
.getParcelableArrayList(KEY_ADAPTER_STATE); | |
setItems(objects); | |
} | |
} | |
/** | |
* Gets all the items in this adapter as an {@code ArrayList} | |
*/ | |
public ArrayList<T> getAllItems(){ | |
ArrayList<T> objects = new ArrayList<T>(getCount()); | |
for (int i = 0; i < getCount(); i++) { | |
objects.add(getItem(i)); | |
} | |
return objects; | |
} | |
/* | |
* Replaces the items in the adapter with those in this list | |
* @param items The items to set into the adapter. | |
*/ | |
public void setItems(ArrayList<T> items){ | |
clear(); | |
addAll(items); | |
} | |
/* Constructors and other boilerplate */ | |
public StateSavingArrayAdapter(Context context, int resource) { | |
super(context, resource); | |
} | |
public StateSavingArrayAdapter(Context context, int resource, | |
int textViewResourceId) { | |
super(context, resource, textViewResourceId); | |
} | |
public StateSavingArrayAdapter(Context context, int resource, T[] objects) { | |
super(context, resource, objects); | |
} | |
public StateSavingArrayAdapter(Context context, int resource, List<T> objects) { | |
super(context, resource, objects); | |
} | |
public StateSavingArrayAdapter(Context context, int resource, | |
int textViewResourceId, T[] objects) { | |
super(context, resource, textViewResourceId, objects); | |
} | |
public StateSavingArrayAdapter(Context context, int resource, | |
int textViewResourceId, List<T> objects) { | |
super(context, resource, textViewResourceId, objects); | |
} | |
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/* | |
* Illustration of how to use the StateSavingArrayAdapter. | |
* | |
* First, have your custom Adapter extend StateSavingArrayAdapter instead of ArrayAdapter. | |
* Then, call the appropriate methods in onSaveInstanceState/ onCreate as illustrated here. | |
* | |
* This example also illustrates how you would save the ListView state itself so that your checked items are remembered. | |
*/ | |
public class StateSavingMainActivity extends Activity { | |
private UserAdapter mAdapter; | |
private ListView mListView; | |
private static final String KEY_LIST_VIEW_STATE = "KEY_LIST_VIEW_STATE"; | |
@Override | |
protected void onCreate(Bundle savedInstanceState) { | |
super.onCreate(savedInstanceState); | |
setContentView(R.layout.main); | |
/* Create the mAdapter instance here. For example, mAdapter = new UserAdapter(this); */ | |
/* Then, restore the adapter state as follows */ | |
if (savedInstanceState != null) { | |
mAdapter.onRestoreInstanceState(savedInstanceState); | |
} | |
mListView = (ListView) findViewById(android.R.id.list); | |
if (savedInstanceState != null | |
&& savedInstanceState.containsKey(KEY_LIST_VIEW_STATE)) { | |
mListView.onRestoreInstanceState(savedInstanceState | |
.getParcelable(KEY_LIST_VIEW_STATE)); | |
} | |
mListView.setAdapter(mAdapter); | |
} | |
@Override | |
protected void onSaveInstanceState(Bundle outState) { | |
super.onSaveInstanceState(outState); | |
mAdapter.onSaveInstanceState(outState); | |
outState | |
.putParcelable(KEY_LIST_VIEW_STATE, mListView.onSaveInstanceState()); | |
} | |
private class UserAdapter extends StateSavingArrayAdapter<User> { | |
/* Add appropriate constructors */ | |
@Override | |
public View getView(int position, View convertView, ViewGroup parent) { | |
/* | |
* Inflate your XML and return the view here | |
*/ | |
return super.getView(position, convertView, parent); | |
} | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment