Skip to content

Instantly share code, notes, and snippets.

@slightfoot
Created August 30, 2014 19:41
Show Gist options
  • Star 5 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save slightfoot/3d582a8c5b78f7737ce3 to your computer and use it in GitHub Desktop.
Save slightfoot/3d582a8c5b78f7737ce3 to your computer and use it in GitHub Desktop.
Test for restoring view state in ViewPager. Because ViewPager does not populate the pages before first Layout and default view state restoration happens before layout.
package com.dd.test;
import android.app.ActionBar;
import android.app.ActionBar.Tab;
import android.app.Activity;
import android.app.FragmentTransaction;
import android.content.Context;
import android.os.Bundle;
import android.os.Parcelable;
import android.support.annotation.StringRes;
import android.support.v4.view.PagerAdapter;
import android.support.v4.view.ViewPager;
import android.util.SparseArray;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ListAdapter;
import android.widget.ListView;
public class TestActivity extends Activity
implements ActionBar.TabListener
{
private ViewPager mViewPager;
@Override
protected void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
TitledListAdapter[] tabs = new TitledListAdapter[2];
tabs[0] = createTestAdapter("Tab 1", 1, 50);
tabs[1] = createTestAdapter("Tab 2", 2, 200);
mViewPager = new ViewPager(this);
mViewPager.setId(R.id.view_pager);
mViewPager.setAdapter(new TitledListPagerAdapter(mViewPager, tabs));
mViewPager.setOnPageChangeListener(new ViewPager.SimpleOnPageChangeListener()
{
@Override
public void onPageSelected(int position)
{
getActionBar().setSelectedNavigationItem(position);
}
});
setContentView(mViewPager);
ActionBar actionBar = getActionBar();
actionBar.setNavigationMode(ActionBar.NAVIGATION_MODE_TABS);
for(int i = 0; i < tabs.length; i++){
actionBar.addTab(actionBar.newTab().setText(tabs[i].getPageTitle())
.setTabListener(this));
}
}
private TitledListAdapter createTestAdapter(String title, int tab, int count)
{
StringBuilder sb = new StringBuilder();
String[] data = new String[count];
for(int i = 0; i < count; i++){
sb.setLength(0);
sb.append("Tab ").append(tab).append(" Item ").append(i);
data[i] = sb.toString();
}
return new TestTabListAdapter(this, title, data);
}
@Override
public void onTabSelected(Tab tab, FragmentTransaction ft)
{
mViewPager.setCurrentItem(tab.getPosition());
}
private class TestTabListAdapter extends ArrayAdapter<String> implements TitledListAdapter
{
private CharSequence mTitle;
public TestTabListAdapter(Context context, @StringRes int titleResId, String[] data)
{
super(context, android.R.layout.simple_list_item_1, data);
mTitle = context.getString(titleResId);
}
public TestTabListAdapter(Context context, CharSequence title, String[] data)
{
super(context, android.R.layout.simple_list_item_1, data);
mTitle = title;
}
@Override
public CharSequence getPageTitle()
{
return mTitle;
}
}
private static class TitledListPagerAdapter extends PagerAdapter
{
private static final String TAG_VIEWS = "tagViews";
private SparseArray<Parcelable> mViewStates = new SparseArray<Parcelable>();
private TitledListAdapter[] mListAdapters;
private ViewPager mViewPager;
public TitledListPagerAdapter(ViewPager viewPager, TitledListAdapter[] listAdapters)
{
mViewPager = viewPager;
mListAdapters = listAdapters;
}
@Override
public CharSequence getPageTitle(int position)
{
return mListAdapters[position].getPageTitle();
}
@Override
public Object instantiateItem(ViewGroup container, int position)
{
ListView listView = new ListView(container.getContext());
listView.setId(R.id.list_view + position);
listView.setAdapter(mListAdapters[position]);
listView.restoreHierarchyState(mViewStates);
container.addView(listView);
return listView;
}
@Override
public boolean isViewFromObject(View view, Object object)
{
return (view == object);
}
@Override
public void destroyItem(ViewGroup container, int position, Object object)
{
View view = (View)object;
view.saveHierarchyState(mViewStates);
container.removeView(view);
}
@Override
public int getCount()
{
return mListAdapters.length;
}
@Override
public Parcelable saveState()
{
final int count = mViewPager.getChildCount();
for(int i = 0; i < count; i++){
View c = mViewPager.getChildAt(i);
if(c.isSaveFromParentEnabled()){
c.saveHierarchyState(mViewStates);
}
}
Bundle bundle = new Bundle();
bundle.putSparseParcelableArray(TAG_VIEWS, mViewStates);
return bundle;
}
@Override
public void restoreState(Parcelable state, ClassLoader loader)
{
Bundle bundle = (Bundle)state;
bundle.setClassLoader(loader);
mViewStates = bundle.getSparseParcelableArray(TAG_VIEWS);
}
}
public static interface TitledListAdapter extends ListAdapter
{
public CharSequence getPageTitle();
}
@Override
public void onTabUnselected(Tab tab, FragmentTransaction ft)
{
//
}
@Override
public void onTabReselected(Tab tab, FragmentTransaction ft)
{
//
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment