书接上回,说一下fragment搭配Viewpager的使用。
Fragment已经在卷一整理过了,这里说一下ViewPager,ViewPager是一个可以左右滑动的容器组件,继承自ViewGroup。一般是用在首页banner和详情页的轮播图展示、APP首次使用的新手引导页、还可以在APP首页和Fragment搭配使用。本篇分析fragment搭配Viewpager的使用。
Viewpager需要和Adaper配合使用,通过viewPager.setAdapter(pagerAdapter);
方法可知要传入一个PagerAdapter对象。
(1)public void setAdapter(@Nullable PagerAdapter adapter) : 设置ViewPager的适配器。
(2)public void addOnPageChangeListener(@NonNull OnPageChangeListener listener):
设置页面改变事件监听器,可以监听当前页面所在的索引,以及页面滑动具体位置,下面细说。
(3)public void setCurrentItem(int item) :可以设置viewpager显示第几个元素,可以是第几个图片或者fragment。
- //fragment切换的Viewpageadapter
- public class MyPagerAdapter extends FragmentPagerAdapter {
- private List
fragments=new ArrayList<>(); - private FragmentManager fm;
- public MyPagerAdapter(FragmentManager fm , List
fragments) { - super(fm);
- this.fm=fm;
- this.fragments.clear();
- this.fragments.addAll(fragments);
- }
-
- @Override
- public Fragment getItem(int position) {
- return fragments.get(position);
- }
-
- @Override
- public int getCount() {
- return fragments.size();
- }
-
- }
这里补充一下PagerAdapter是个抽象类,FragmentPagerAdapter 和FragmentStatePagerAdapter都是它的两个实现类。
FragmentPagerAdapter加载Fragment内存开销比较大,但页面切换比较丝滑;FragmentStatePagerAdapter内存占用少,页面切换效果略逊一筹。我这里就四个Fragment因此用了FragmentPagerAdapter,应用开发中请大家根据实际情况选择。
2.2 准备fragment并设置Adapter
- fragmentHome = new FragmentHome();
- fragmentApp = new FragmentApp();
- fragmentMsg = new FragmentMsg();
- fragmentMy = new FragmentMy();
-
-
- //使用Viewpage切换
- fragments.add(fragmentHome);
- fragments.add(fragmentApp);
- fragments.add(fragmentMsg);
- fragments.add(fragmentMy);
-
-
-
- MyPagerAdapter pagerAdapter = new MyPagerAdapter(manager, fragments);
- viewPager.setAdapter(pagerAdapter);
-
- pagerAdapter.notifyDataSetChanged();
//借助Viewpage切换fragment
viewPager.setCurrentItem(0);
- viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
-
- @Override
- public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
- Log.e(TAG, "viewPager-onPageScrolled: position=" + position + " positionOffset=" + positionOffset + " positionOffsetPixels=" + positionOffsetPixels);
- }
-
- @Override
- public void onPageSelected(int position) {
- Log.e(TAG, "viewPager-onPageSelected: position= " + position);
- viewPager.setCurrentItem(position);
- }
-
-
- @Override
- public void onPageScrollStateChanged(int state) {
- Log.e(TAG, "viewPager-onPageScrollStateChanged: state=" + state);
- }
- });
3、啥原理
因为ViewPager重写了View类的computeScroll方法,并在computeScroll中调用onPageScrolled并且里还调用了view的scrollTo实现view滑动,重写view中的这个方法,computeScroll和scrollTo配合专门负责实现滑动的
3.2再说三个关键回调方法
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels)页面滚动的所以和坐标变化
public void onPageSelected(int position) 一次完整滑动结束以后这个方法返回当前索引,上面的例子时在这里调用 viewPager.setCurrentItem(position);切换了fragment,其实引导页或者详情页轮播图切换时当前页码或者底部小圆点都时在这里进行切换。
public void onPageScrollStateChanged(int state)页面的滑动状态,定义了几个常量值:
/**
* * Indicates that the pager is in an idle, settled state. The current page
* * is fully in view and no animation is in progress.
* public static final int SCROLL_STATE_IDLE = 0; //滑动停止
*
* * Indicates that the pager is currently being dragged by the user.
* public static final int SCROLL_STATE_DRAGGING = 1; //开始滑动
*
* * Indicates that the pager is in the process of settling to a final position.
* public static final int SCROLL_STATE_SETTLING = 2; //正在滑动
*/
个人总结记录,才疏学浅,如有错误,欢迎指正,多谢。