原创 android之ViewPager的使用

2021-6-11 13:15 2527 14 14 分类: 软件与OS 文集: android studio

ViewPager是一个非常强大的 UI组件,应用非常广泛。它提供了多界面切换的效果,具体来说就是当前显示一组界面中的一个界面,当用户左右滑动界面时,当前的屏幕显示当前界面和下一个界面的一部分,滑动结束后,界面自动跳转到当前选择的界面中。

下面用实例来说明如何使用。

和之前的其他控件一样,使用ViewPager也需要把ViewPager对应的控件加入布局文件中。在MainActivity对应的布局文件中添加 ViewPager 的代码如下

<?xml version="1.0" encoding="utf-8"?>
  • <RelativeLayout 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/viewPager"
  • android:layout_width="match_parent"
  • android:layout_height="match_parent"/>
  • </RelativeLayout>
  • 复制代码

    当完成布局文件之后,在Activity 文件中根据id获取 ViewPager。与使用ListView 相似,还需要一个适配器类来处理 ViewPager 的页面。

    MainActivity 代码如下

    package com.rfstar.viewpager;
  • import androidx.appcompat.app.AppCompatActivity;
  • import androidx.viewpager.widget.ViewPager;
  • import android.os.Bundle;
  • import android.view.LayoutInflater;
  • import android.view.View;
  • import java.util.ArrayList;
  • import java.util.List;
  • public class MainActivity extends AppCompatActivity {
  • @Override
  • protected void onCreate(Bundle savedInstanceState) {
  • super.onCreate(savedInstanceState);
  • setContentView(R.layout.activity_main);
  • initView();
  • }
  • private void initView() {
  • ViewPager viewPager=(ViewPager)findViewById(R.id.viewPager);
  • LayoutInflater layoutInflater=getLayoutInflater();
  • View firstView=layoutInflater.inflate(R.layout.first_page,null);//第一个页面
  • View secondView=layoutInflater.inflate(R.layout.second_page,null);//第二个页面
  • View thirdView=layoutInflater.inflate(R.layout.third_page,null);//第三个页面
  • List<View> pages=new ArrayList<>();//创建一个集合来存放这三个页面
  • pages.add(firstView);
  • pages.add(secondView);
  • pages.add(thirdView);
  • ViewPagerAdapter viewPagerAdapter=new ViewPagerAdapter(pages);//创建适配器对象
  • viewPager.setAdapter(viewPagerAdapter);//设置适配器
  • }
  • }
  • 复制代码

    适配器代码如下:

    package com.rfstar.viewpager;
  • import android.view.View;
  • import android.view.ViewGroup;
  • import androidx.annotation.NonNull;
  • import androidx.viewpager.widget.PagerAdapter;
  • import java.util.List;
  • class ViewPagerAdapter extends PagerAdapter {
  • private List<View> pagelist;
  • public ViewPagerAdapter(List<View> list)
  • {
  • this.pagelist=list;
  • }
  • @Override
  • public int getCount() {
  • return pagelist.size();
  • }
  • @Override
  • public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
  • return view==object;
  • }
  • @Override
  • public Object instantiateItem(ViewGroup container, int position)
  • {
  • container.addView(pagelist.get(position));
  • return pagelist.get(position);
  • }
  • @Override
  • public void destroyItem(ViewGroup container,int position,Object object)
  • {
  • container.removeView(pagelist.get(position));
  • }
  • }
  • 复制代码

    Activity 中还涉及3View 页面

    First_page.xml文件的代码如下:

    <?xml version="1.0" encoding="utf-8"?>
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  • android:orientation="vertical" android:layout_width="match_parent"
  • android:layout_height="match_parent">
  • <TextView
  • android:layout_width="wrap_content"
  • android:layout_height="wrap_content"
  • android:text="this is first page"
  • android:textSize="30sp"/>
  • </LinearLayout>
  • 复制代码

    Second_page.xml代码如下:

    <?xml version="1.0" encoding="utf-8"?>
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  • android:orientation="vertical" android:layout_width="match_parent"
  • android:layout_height="match_parent">
  • <TextView
  • android:layout_width="wrap_content"
  • android:layout_height="wrap_content"
  • android:text="this is second page"
  • android:textSize="30sp"/>
  • </LinearLayout>
  • 复制代码

    Third_page.xml代码如下:

    <?xml version="1.0" encoding="utf-8"?>
  • <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  • android:orientation="vertical" android:layout_width="match_parent"
  • android:layout_height="match_parent">
  • <TextView
  • android:layout_width="wrap_content"
  • android:layout_height="wrap_content"
  • android:text="this is third page"
  • android:textSize="30sp"/>
  • </LinearLayout>
  • 复制代码

    运行程序,然后滑动页面,当页面滑动到一半时效果如图1-1所示,当滑动完成时效果如图 1-2 所示。

    1-1

    1-2

    在上例中,主要部分有两处,一处是initView()方法,一处是适配器类

    initView()方法中通过 findViewByld()方法获取了ViewPager,然后通过LayoutInflater获取布局文件,使用 Iist存储这3个布局文件对应的View,再将list传入ViewPageAdapter这个适配器中,再用 ViewPager类的setAdapterO方法让ViewPagerAdpter设置为它的适配器。这个过程和ListView的过程非常相似。

     

    对于适配器,想必大家都不陌生,在ListView中也有适配器,listView通过重写 getView()函数来获取当前要加载的item,但是这里面的适配器 ViewPagerAdapter类和 ListView的适配器可能不太相同。

    通过借助上面的实例,我们知道要实现一个 PagerAdapter适配器至少需要覆盖以下四个方法

    getCount()

    返回要滑动的 View 个数

    instantiateltem(ViewGroup container,int position)

    创建指定位置的页面视图。适配器有责任增加即将创建的 View 视图到给定的 container 中,这是为了确保在 finishUpdateviewGroup)返回时已经完

    成。此方法的返回值是一个代表新增视图页面的 ObjetKey),上述实例

    中直接返回了视图本身。当然这里没必要非要返回视图本身,也可以是这个页面的其他容器,甚至是可以代表当前页面的任意值,只要可以与增加的 View 一一对应即可,比如 position 变量也可以作为 Key

    destroyltem(ViewGroup container,in position, Object object)

    移除一个给定位置的页面。适配器有责任从容器中删除这个视图。这是为

    了确保在 finishUpdateviewGroup)返回时视图能够被移除

    isViewFromObject(View. Object)

    用来判断 instantiateltem(ViewGroupint)方法所返回的Key 与一个页面视图代表的是否为同一个视图(判断两者是否对应,对应就表示同一个View)。

    本实例中 instantiateltem(ViewGroupint)方法返回了视图本身,因为在此方法中使用视图与之比较,所以自然返回的是 true

    另外,PagerAdapter支持数据集合的改变,数据集合的改变必须要在主线程里面执行,然后还要调用 notifyDataSetChanged方法。和BaseAdapter 非常相似。数据集合的改变包括页面的添加删除和修改位置。

    android studio工具及手机模拟器以及更多工程源代码下载请前往微信公众号:大鸟科创空间,回复:android studio即可获取。

    作者: 大鸟科创空间, 来源:面包板社区

    链接: https://mbb.eet-china.com/blog/uid-me-3949041.html

    版权声明:本文为博主原创,未经本人允许,禁止转载!

    PARTNER CONTENT

    文章评论0条评论)

    登录后参与讨论
    我要评论
    0
    14
    关闭 站长推荐上一条 /3 下一条