FragmentPagerAdapter


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;
    }
}












  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值