Android学习-ViewPager与PagerAdapter合用实现滑动翻页

项目中需要实现滑动翻阅App引导页,特此记录实现过程。

Android开发中使用到的UI控件有很多,比如TextView、ImageView、Button等等,这些都是比较基础的控件,可以单独使用,而今天介绍的是ViewPager控件,ViewPager 是一种可以让用户通过左右滑动来切换页面的控件,通过它我们可以展示超过屏幕尺寸大小的内容,在某种程度上它可以说是实现多页面的最佳方式,同时 ViewPager 还支持任意动态的添加/删除页面。但是ViewPager不能单独使用,需要配合PagerAdapter一起合用才能实现期望的效果。

准备布局文件

1. 首先创建一个与GuideActivity.java相对应的布局文件用于放置ViewPager。也可以放一些每个引导页都包含的控件,例如我这里放置了“跳过”按钮:

代码如下(activity_guide.xml):

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:gravity="top">

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

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_margin="30dp"
        android:gravity="center"
        android:orientation="horizontal">

        <ImageView
            android:id="@+id/iv_music_switch"
            android:layout_width="30dp"
            android:layout_height="30dp"
            android:src="@drawable/img_guide_music" />

        <TextView
            android:id="@+id/tv_guide_skip"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="20dp"
            android:text="跳过"
            android:background="@drawable/corner_view"
            android:textColor="@color/white"
            android:textSize="20sp" />
    </LinearLayout>

</RelativeLayout>

 

效果如图所示:

 

2. 另外分别准备三个布局文件(layout_pager_guide_1.xml、layout_pager_guide_2.xml、layout_pager_guide_3.xml),放置三个引导页具体要显示的内容,我这里只放了一个ImageView,效果如下:

 

重写适配器

新建一个类继承PagerAdapter,需要重写四个方法,具体代码如下:

package com.tangyibo.framework.base;

import android.view.View;
import android.view.ViewGroup;

import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;

import java.util.List;

public class BasePagerAdapter extends PagerAdapter {

    private List<View> mList;

    public BasePagerAdapter(List<View> mList){
        this.mList = mList;
    }

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

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

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

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

 

GuideActivity.java内逻辑编写

这里有一点小难度,首先把主布局文件的控件都声明出来,包括ImageView、TextView和ViewPager,同时声明三个view用于保存三个布局文件,再声明一个list用于保存这三个view;具体代码如下:

package com.tangyibo.planet.ui;

import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import android.widget.TextView;

import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;

import com.tangyibo.framework.base.BaseActivity;
import com.tangyibo.framework.base.BasePagerAdapter;
import com.tangyibo.framework.base.BaseUIActivity;
import com.tangyibo.planet.R;

import java.util.ArrayList;
import java.util.List;

/**
 * 引导页
 * 1.ViewPager : 适配器|帧动画播放
 * 2.歌曲的播放
 * 3.属性动画旋转
 * 4.跳转
 */

public class GuideActivity extends BaseActivity {

    private ImageView iv_music_switch; //音乐图标
    private TextView tv_guide_skip; //跳过
    private ViewPager mViewPager;

    private View view1; //guide_1
    private View view2; //guide_2
    private View view3; //guide_3

    private List<View> mPageList = new ArrayList<>(); //用list保存三个页面view



    private void initView() {
        iv_music_switch = (ImageView) findViewById(R.id.iv_music_switch);
        tv_guide_skip = (TextView) findViewById(R.id.tv_guide_skip);
        mViewPager = (ViewPager) findViewById(R.id.mViewPager);

        //三个页面布局文件传给view
        view1 = View.inflate(this, R.layout.layout_pager_guide_1, null);
        view2 = View.inflate(this, R.layout.layout_pager_guide_2, null);
        view3 = View.inflate(this, R.layout.layout_pager_guide_3, null);
        //用一个list管理三个引导页面
        mPageList.add(view1);
        mPageList.add(view2);
        mPageList.add(view3);

        mViewPager.setAdapter(new BasePagerAdapter(mPageList));


    }

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_guide);
        initView();
    }


}

显示效果:

      

 

posted @ 2022-03-24 14:53  一笼灌汤包  阅读(654)  评论(0编辑  收藏  举报