【Android基础】ViewPager

ViewPage是一个ViewGroup,可以包含很多的View,当手指在屏幕上左右滑动的时候,可以切换页面。ViewPager一般与Fragment结合使用比较方便。

一、ViewPager监听

viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
    /**
     * 页面滚动过程中回调
     */
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
    /*
     * position 被拖得页面的位置
     * positionOffset 当前页面偏移的比例0--0.999999...
     * positionOffsetPixels 当前页面偏移的像素值
    */
    }
    /**
     * 页面选中回调
     */
    @Override
    public void onPageSelected(int position) {

    }
    /**
     * 页面状态改变时回调
     */
    @Override
    public void onPageScrollStateChanged(int state) {

    }
});

二、ViewPager与适配器

1、PagerAdapter

A、介绍

PageAdapter 是 ViewPager 的支持者,ViewPager 将调用它来取得所需显示的页,而 PageAdapter 也会在数据变化时,通知 ViewPager。这个类也是FragmentPagerAdapter 以及 FragmentStatePagerAdapter 的基类。如果继承该类,至少需要实现 instantiateItem(), destroyItem(), getCount()以及 isViewFromObject()四个方法。
1)Object instantiateItem(ViewGroup container, int position):往ViewPager中添加要显示的条目内容。参数一:ViewPager,参数二:条目的位置,返回值:显示在屏幕上的对象
2)void destroyItem(ViewGroup container, int position, Object object):从当前的ViewPager容器中删除指定位置的View对象。
3)getCount ():返回要滑动的View的个数。
4)boolean isViewFromObject(View view, Object object):该方法用来判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View) 返回值:如果对应的是同一个View,返回True,否则返回False。一般返回view==object

B、基本使用

1)在布局文件中添加ViewPager控件。注意:写这个控件的时候要写全称(包名+类名)

    

2)加载要显示的页面,并把要显示的页面放入数组或List 集合中

        viewPager = findViewById(R.id.view_pager);

        List viewList = new ArrayList<>();
        LayoutInflater layoutInflater = getLayoutInflater();
        
        view1 = layoutInflater.inflate(R.layout.view_pager1, null);
        view2 = layoutInflater.inflate(R.layout.view_pager2, null);

        viewList.add(view1);
        viewList.add(view2);

3)写自己的Adapter,继承PagerAdapter

public class MyAdapter extends PagerAdapter {
    private List viewList;

    public MyAdapter(List arrayList) {
        this.viewList = arrayList;
    }

    @Override
    public int getCount() {
        return viewList.size();
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        container.addView(viewList.get(position));
        return viewList.get(position);
    }

    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(viewList.get(position));
    }
}

4)设置它的Adapter

        MyAdapter myAdapter = new MyAdapter(viewList);
        viewPager.setAdapter(myAdapter);

2、FragmentPagerAdapter

A、介绍

FragmentPagerAdapter是PagerAdapter的其中一种实现(其子类)。它将每一个页面表示为一个 Fragment,并且每一个Fragment都将会保存到fragmentManager当中。而且,当用户没可能再次回到页面的时候,fragmentManager才会将这个Fragment销毁。
让Fragment 成为ViewPager的一页时,FragmentManager会一直保存管理创建好了的Fragment,即使当前不是显示的这一页,Fragment对象也不会被销毁,在后台默默等待重新显示。但如果Fragment不再可见时,它的视图层次会被销毁掉,下次显示时视图会重新创建。
使用FragmentPagerAdapter至少需要实现以下两个方法:getCount()和getItem()
1)int getCount():返回要滑动的View的个数。
2)Fragment getItem(int position):要显示的fragent对象

B、ViewPager+fragment实现页卡滑动切换页面

1)在布局文件中添加ViewPager控件。注意:写这个控件的时候要写全称(包名+类名)

    

2)建多个fragment类

public class TestFragment extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.test_fragment, container, false);
    }
}
public class TestFragment2 extends Fragment {
    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.test_fragment2, container, false);
    }
}

3)加载要显示的页面,并把要显示的页面放入数组或List 集合中

        viewPager = findViewById(R.id.pager);

        List list = new ArrayList<>();
        list.add(new TestFragment());
        list.add(new TestFragment2());

4)写自己的Adapter,继承PagerAdapter

public class MyPagerAdapter extends FragmentPagerAdapter {
    private List fragmentList;
    public MyPagerAdapter(@NonNull FragmentManager fm, List list) {
        super(fm);
        this.fragmentList = list;
    }
    
    @NonNull
    @Override
    public Fragment getItem(int position) {
        return fragmentList.get(position);
    }

    @Override
    public int getCount() {
        return fragmentList.size();
    }
}

5)设置它的Adapter

        MyPagerAdapter myPagerAdapter = new MyPagerAdapter(getSupportFragmentManager(), list);
        viewPager.setAdapter(myPagerAdapter);

你可能感兴趣的:(Android基础)