Android ViewPager最简单使用

发布时间:2023年12月18日

首先,ViewPager已经被淘汰了,目前应该使用ViewPager2。我之所以看这个是有某种原因。

事由:

在网上看到很多关于ViewPager的文章,但是大多数都结合了一些其他的东西,比如shape、Selector,让我这种小白看得云里雾里。真的叫难者不会、会者不难。所以在勉强看懂后,精简了一下。

ViewPager是安卓的一个组件,允许用户左右滑动显示放置在里面的多个View。

PagerAdapter用于向ViewPager中放入多个View。

用法:

一、构建布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    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/imagePager"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="horizontal" />

</LinearLayout>

二、自定义一个Adapter类继承自PagerAdapter

一般来说,我们需要为自定义的Adapter类准备一个构造函数,用于保存传入的参数,并且生成需要左右滑动的多个View。

1、需要从活动传入上下文

2、需要传入每个滑动页面的背景图(也可以传入包含背景图的自定义类)

为了简单,我们只传入了背景图的id,因为ImageView也是View的一种,所以就直接在ViewPager中构建了一个List<ImageView>来存放需要滑动的View。

大多数情况下,你需要为滑动页面写一个布局文件,不仅包括背景图,还包括一些按钮什么的。

public class MyPagerAdapter extends PagerAdapter {
    private Context myContext;
    private int[] imageArray;

    private List<ImageView> images;

    public MyPagerAdapter(Context myContext, int[] imageArray) {
        this.myContext = myContext;
        this.imageArray = imageArray;

        images = new ArrayList<>();
        for (int id : imageArray) {
            ImageView view = new ImageView(myContext);
            // 设置图片填满整个容器
            view.setScaleType(ImageView.ScaleType.FIT_XY);
            view.setLayoutParams(new ViewGroup.LayoutParams(
                    ViewGroup.LayoutParams.MATCH_PARENT,
                    ViewGroup.LayoutParams.MATCH_PARENT));
            view.setImageResource(id);
            images.add(view);
        }
    }

三、重写父类方法

至少需要重写四个父类方法。

1、getCount():返回可滑动的View总数

2、isViewFromObject:判断instantiateItem()函数所返回来的Key与一个页面视图是否同一个视图

3、instantiateItem():装填当前位置的View

4、destroyItem():去除当前位置的View

只要一开始初始化好了View的列表,这四个方法基本上都不需要改动。

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

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

    @NonNull
    @NotNull
    @Override
    public Object instantiateItem(@NonNull @NotNull ViewGroup container, int position) {
        ImageView view = images.get(position);
        container.addView(view);
        return view;
    }

    @Override
    public void destroyItem(@NonNull @NotNull ViewGroup container, int position, @NonNull @NotNull Object object) {
        container.removeView(images.get(position));
    }
}

四、关联Adapter

简单的通过setAdaper()方法,将ViewPager和自定义的PagerAdapter关联起来。

public class MainActivity extends AppCompatActivity {

    // 定义引导页图片数组
    private int[] imageArray = {R.drawable.yingdao1, R.drawable.yingdao2,
            R.drawable.yingdao3, R.drawable.yingdao4};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ViewPager viewPager = findViewById(R.id.imagePager);
        MyPagerAdapter adapter = new MyPagerAdapter(this, imageArray);
        viewPager.setAdapter(adapter);
    }
}

五、还需要做什么

做完上面的部分,就已经可以滑动了。不过很多时候还需要为ViewPager增加一个addOnPageChangeListener()方法,然后重写以下方法,来提供更多的功能:

1、onPageScrolled
2、onPageSelected
3、onPageScrollStateChanged

文章来源:https://blog.csdn.net/itsgoodtobebad/article/details/135004521
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。