package android.support.v4.app;
Implementation of {@link android.support.v4.view.PagerAdapter} that
* represents each page as a {@link Fragment} that is persistently
* kept in the fragment manager as long as the user can return to the page.
pagerAdapter的子类,适用于要静态的数据变化不多,且个数不应太多的 ,每个item都是fragment的情况。
fragment创建后就在内存中,不会释放(不同于pagerAdapter),直到当前页面退出
* <p>This version of the pager is best for use when there are a handful of
* typically more static fragments to be paged through, such as a set of tabs.
* The fragment of each page the user visits will be kept in memory, though its
* view hierarchy may be destroyed when not visible. This can result in using
* a significant amount of memory since fragment instances can hold on to an
* arbitrary amount of state. For larger sets of pages, consider
* {@link FragmentStatePagerAdapter}.
适用于: 静态fragment, 若item很多且动态变化考虑 FragmentStatePagerAdapter
* <p>Subclasses only need to implement {@link #getItem(int)}
* and {@link #getCount()} to have a working adapter.
只需实现 getItem getCount
实例:
public class MyAdapter extends FragmentPagerAdapter {
private List<String> data;
public MyAdapter(FragmentManager fragmentManager, Context context) {
this(fragmentManager, context, null);
}
public MyAdapter(FragmentManager fragmentManager, Context context, List<String> data) {
super(fragmentManager);
this.data = data;
if (null == data) {
this.data = new ArrayList<>();
}
}
@Override
public Fragment getItem(int position) {
MyFragment fragment = null;
fragment = new MyFragment();
Bundle bundle = new Bundle();
bundle.putInt("data", position);
fragment.setArguments(bundle);
return fragment;
}
@Override
public float getPageWidth(int position) {
return 1f;
}
@Override
public CharSequence getPageTitle(int position) {
return data.get(position);
}
@Override
public int getCount() {
return null == data ? 0 : data.size();
}
}
附源码:
@Override
public Object instantiateItem(ViewGroup container, int position) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
final long itemId = getItemId(position);
// Do we already have this fragment?
String name = makeFragmentName(container.getId(), itemId);
Fragment fragment = mFragmentManager.findFragmentByTag(name);
if (fragment != null) {
if (DEBUG) Log.v(TAG, "Attaching item #" + itemId + ": f=" + fragment);
mCurTransaction.attach(fragment);
} else {
fragment = getItem(position);
if (DEBUG) Log.v(TAG, "Adding item #" + itemId + ": f=" + fragment);
mCurTransaction.add(container.getId(), fragment,
makeFragmentName(container.getId(), itemId));
}
if (fragment != mCurrentPrimaryItem) {
fragment.setMenuVisibility(false);
fragment.setUserVisibleHint(false);
}
return fragment;
}
我们只需实现抽象方法 getItem();
例外 getItemId(position)表明每个item都需要设置一个id值
/**
* Return a unique identifier for the item at the given position.
*
* <p>The default implementation returns the given position.
* Subclasses should override this method if the positions of items can change.</p>
*
* @param position Position within this adapter
* @return Unique identifier for the item at position
*/
public long getItemId(int position) {
return position;
}
@Override
public boolean isViewFromObject(View view, Object object) {
return ((Fragment)object).getView() == view;
}
注意 一般情况下不要override 若在自己类中重写为: return view==object 会出现问题
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
if (mCurTransaction == null) {
mCurTransaction = mFragmentManager.beginTransaction();
}
if (DEBUG) Log.v(TAG, "Detaching item #" + getItemId(position) + ": f=" + object
+ " v=" + ((Fragment)object).getView());
mCurTransaction.detach((Fragment)object);
}
@Override
public void setPrimaryItem(ViewGroup container, int position, Object object) {
Fragment fragment = (Fragment)object;
if (fragment != mCurrentPrimaryItem) {
if (mCurrentPrimaryItem != null) {
mCurrentPrimaryItem.setMenuVisibility(false);
mCurrentPrimaryItem.setUserVisibleHint(false);
}
if (fragment != null) {
fragment.setMenuVisibility(true);
fragment.setUserVisibleHint(true);
}
mCurrentPrimaryItem = fragment;
}
}