美文网首页高级UI
ViewPager<第一篇>:基本使用

ViewPager<第一篇>:基本使用

作者: NoBugException | 来源:发表于2019-11-28 15:34 被阅读0次

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);
    }
}

需要重写getCountisViewFromObjectinstantiateItemdestroyItem方法。

  • 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));

【第五步】 效果展示

312.gif

另外,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:滑动后滑翔的状态

[本章完...]

相关文章

网友评论

    本文标题:ViewPager<第一篇>:基本使用

    本文链接:https://www.haomeiwen.com/subject/ybfgkctx.html