ViewPage是一个ViewGroup,可以包含很多的View,当手指在屏幕上左右滑动的时候,可以切换页面。ViewPager一般与Fragment结合使用比较方便。
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) {
}
});
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
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);
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对象
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);