您的位置:首页 > 移动开发 > Android开发

【Android基础】ViewPager

2020-02-17 02:52 507 查看

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控件。注意:写这个控件的时候要写全称(包名+类名)

<androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/view_pager"/>

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

viewPager = findViewById(R.id.view_pager);

List<View> 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<View> viewList;

public MyAdapter(List<View> 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控件。注意:写这个控件的时候要写全称(包名+类名)

<androidx.viewpager.widget.ViewPager
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/pager"/>

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<Fragment> list = new ArrayList<>();
list.add(new TestFragment());
list.add(new TestFragment2());

4)写自己的Adapter,继承PagerAdapter

public class MyPagerAdapter extends FragmentPagerAdapter {
private List<Fragment> fragmentList;
public MyPagerAdapter(@NonNull FragmentManager fm, List<Fragment> 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);
  • 点赞
  • 收藏
  • 分享
  • 文章举报
SDM&XDD 发布了5 篇原创文章 · 获赞 0 · 访问量 317 私信 关注
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: