Created
August 30, 2014 19:41
-
-
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.
This file contains hidden or 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
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