Viewpager,视图翻页工具,提供了多页面切换的效果。Viewpager使用起来就是我们通过创建adapter给它填充多个view,左右滑动时,切换不同的view。Google官方是建议我们使用Fragment来填充ViewPager的,这样可以更加方便的生成每个Pager,以及管理每个Pager的生命周期。
下面来说说ViewPager的基本使用。
【第一步】
在xml中声明viewpager
<androidx.viewpager.widget.ViewPager
android:id="@+id/viewpager"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
【第二步】
准备好ViewPager的公共视图
item_base.xml
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:id="@+id/tv"
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#F3AA71"
android:gravity="center"
android:text=""
android:textSize="22sp">
</TextView>
【第三步】
创建PagerAdapter
public class MyPagerAdapter extends PagerAdapter {
private Context mContext;
private List<String> mData;
public MyPagerAdapter(Context context , List<String> list) {
mContext = context;
mData = list;
}
@Override
public int getCount() {
return mData.size();
}
@Override
public boolean isViewFromObject(View view, Object object) {
return view == object;
}
@Override
public Object instantiateItem(ViewGroup container, int position) {
View view = View.inflate(mContext, R.layout.item_base,null);
TextView tv = (TextView) view.findViewById(R.id.tv);
tv.setText(mData.get(position));
container.addView(view);
return view;
}
@Override
public void destroyItem(ViewGroup container, int position, Object object) {
container.removeView((View)object);
}
}
需要重写getCount
、isViewFromObject
、instantiateItem
、destroyItem
方法。
- getCount:这是必须要重写的方法,返回适配器数据的数量,或者说是
总页数
; - isViewFromObject:这个是固定写法,按照上面的代码中写就对了;
- instantiateItem:初始化每页的视图,示例中的视图由
R.layout.item_base
建立,将视图放入ViewPager中,这个方法的返回值就是布局生成的视图;当ViewPager的页数大于等于2时,第一次初始化两页的视图到内存中,比如当前页角标为0,那么就默认初始化角标为0和角标为1的视图;如果当前页角标为1,那么内存中几个视图对应的角标是:0,1,2。 - destroyItem:销毁视图。那么,这个方法到底销毁的是哪一页的视图呢?假设当前页角标为0,那么缓存中视图的角标为0,1,当滑到1时,2会被立即初始化,并加载到缓存中,当滑到2时,3会被立即初始化,并加载到缓存中,此时缓存中的视图角标是0,1,2,3,ViewPager默认不允许内存中存在3个以上的视图,所以此时将执行
destroyItem
方法,销毁角标为0的视图,当滑到最后一页时,比如最后一页的角标为5,那么角标为3的视图会被销毁。
【第四步】
代码实现
viewpager = findViewById(R.id.viewpager);
List<String> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
list.add("第"+i+"个View");
}
viewpager.setAdapter(new MyPagerAdapter(this,list));
【第五步】
效果展示

另外,ViewPager还自带标题栏
- PagerTabStrip:带有下划线
- PagerTitleStrip:不带下划线
这两个没人用了吧。在5.0之后推出了TabLayout
控件,当时这个控件已经取代了以上两个标题栏控件。
【第六步】
监听
viewpager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
- onPageScrolled:页面滑动状态停止前一直调用
position:当前点击滑动页面的位置
positionOffset:当前页面偏移的百分比
positionOffsetPixels:当前页面偏移的像素位置
- onPageSelected:滑动后显示的页面
position:选中显示页面的位置
- onPageScrollStateChanged:页面状态改变时调用
state:当前页面的状态
SCROLL_STATE_IDLE
:空闲状态
SCROLL_STATE_DRAGGING
:滑动状态
SCROLL_STATE_SETTLING
:滑动后滑翔的状态
[本章完...]
网友评论