04、ViewPager的使用

141 阅读1分钟

1 ViewPager简介

  • ViewPager这个类可以让用户切换当前的View
  • ViewPager 是 v4 包中的一个类。
  • ViewPager类直接继承了ViewGroup类,所以它是一个容器类,可以在其中添加其他View类。
  • ViewPager类需要一个PagerAdapter适配器类给它提供数据
  • ViewPager经常和Fragment一起使用,并且提供了专门的FragmentPagerAdapterFragmentStatePagerAdapter类供Fragment中的ViewPager使用。

2 ViewPager的应用场景

  • 引导界面、相册多图片预览
  • 多Tab页面、APP导航
  • 广告播放展示

3 ViewPager的使用

  1. 编写activity_main.xml布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">
​
    <androidx.viewpager.widget.ViewPager
        android:id="@+id/view_pager"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </androidx.viewpager.widget.ViewPager>
</LinearLayout>
  1. 编写三个布局view1.xml、view2.xml、view3.xml(三个布局类似)
<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <TextView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:text="view1"
        android:textSize="40sp"/>
</androidx.constraintlayout.widget.ConstraintLayout>
  1. 编写MainActivity活动类
public class MainActivity extends AppCompatActivity {
​
    private static final String TAG = "LCG_MainActivity";
    private ViewPager viewPager;
    private int[] mLayoutIds = {
            R.layout.view1,
            R.layout.view2,
            R.layout.view3};
    private List<View> views;//存放view的集合
    PagerAdapter mPagerAdapter;//适配器
​
​
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
​
        viewPager = findViewById(R.id.view_pager);//实例化ViewPager
​
        //将要显示的布局存放到list集合
        views = new ArrayList<View>();
        for (int i = 0; i < mLayoutIds.length; i++) {
            View view = getLayoutInflater().inflate(mLayoutIds[i], null);
            views.add(view);
        }
​
        //实例化一个PagerAdapter的适配器
        mPagerAdapter = new PagerAdapter() {
            /**
             * 返回要滑动的VIew的个数
             * @return
             */
            @Override
            public int getCount() {
                return views.size();
            }
​
            /**
             * 判断pager的一个view是否和instantiateItem方法返回的object有关联
             * @param view
             * @param object
             * @return
             */
            @Override
            public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
                return view == object;
            }
​
            /**
             * 第一:将当前视图添加到container中
             * 第二:返回当前View
             * @param container
             * @param position
             * @return
             */
            @Override
            public Object instantiateItem(@NonNull ViewGroup container, int position) {
                View childView = views.get(position);
                container.addView(childView);
                return childView;
            }
​
            /**
             * 从当前container中删除指定位置(position)的View
             * @param container
             * @param position
             * @param object
             */
            @Override
            public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
                View childView = views.get(position);
                container.removeView(childView);
            }
        };
        //设置适配器
        viewPager.setAdapter(mPagerAdapter);
    }
}

4 另一种写法

MyPagerAdapter.class

public class MyPagerAdapter extends PagerAdapter {
​
    private List<View> mViews;
    private Context mContext;
​
    public MyPagerAdapter(List<View> mViews, Context mContext) {
        this.mViews = mViews;
        this.mContext = mContext;
    }
​
    public MyPagerAdapter(List<View> mViews) {
        this.mViews = mViews;
    }
​
    @Override
    public int getCount() {
        return mViews.size();
    }
​
    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }
​
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        View view = mViews.get(position);
        container.addView(view);
        return view;
    }
​
    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView(mViews.get(position));
    }
}

MainActivity.class

private void initView(){
    //初始化数据,将要显示的布局存放到list集合
    views = new ArrayList<View>();
    for (int i = 0; i < mLayoutIds.length; i++) {
        ImageView view = new ImageView(this);
        view.setImageResource(R.mipmap.ic_launcher);
        //View view = getLayoutInflater().inflate(mLayoutIds[i], null);
        views.add(view);
    }
    viewPager = findViewById(R.id.view_pager);//实例化ViewPager
    mPagerAdapter = new MyPagerAdapter(views, this);
    //设置适配器
    viewPager.setAdapter(mPagerAdapter);
}

代码:

gitee.com/maojiu0825/…