Android之ViewPager(一)

效果图


一、activity_main.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"
    >

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


</RelativeLayout>

二、新建三个layout,用于滑动切换的视图

1、view_first.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="match_parent"
        android:layout_height="match_parent"
        android:text="first"
        android:textSize="40sp"
        android:background="#ff0000"
        />

</LinearLayout>

2、view_second.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="match_parent"
        android:layout_height="match_parent"
        android:text="second"
        android:textSize="40sp"
        android:background="#00ff00"/>

</LinearLayout>

3、view_third.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="match_parent"
        android:layout_height="match_parent"
        android:text="third"
        android:textSize="40sp"
        android:background="#ff00ff"/>

</LinearLayout>

三、MainActivity.java

package com.example.viewpager;

import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.PagerAdapter;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import java.util.ArrayList;
import java.util.List;


public class MainActivity extends AppCompatActivity {

    private ViewPager mViewPager;

    private int[] mLayoutIDs={
            R.layout.view_first,
            R.layout.view_second,
            R.layout.view_third
    };
    private List<View> mViews;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.activity_main);

        mViewPager = (ViewPager)findViewById(R.id.view_pager);


        //初始化数据:将视图循环添加到List
        mViews = new ArrayList<>();

        /*
        getLayoutInflater() 获取解析视图
         */
        for (int index = 0; index < mLayoutIDs.length ; index++) {
            final View view = getLayoutInflater().inflate(mLayoutIDs[index], null);
            mViews.add(view);//快捷键:opt+cmd+V 提取参数
        }

        //设置adapter
        mViewPager.setAdapter(mPagerAdapter);//传入参数为PagerAdapter adpter,故在下面新建PagerAdapter

    }


    PagerAdapter mPagerAdapter=new PagerAdapter() {

        /**
         * @return 数据总量
         */
        @Override
        public int getCount() {
            return mLayoutIDs.length;
        }

        /**
         * 视图是不是一个对象
         * @param view
         * @param object
         * @return
         */
        @Override
        public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
            return view==object;
        }

        /**
         * 把每次的视图添加进去
         * @param container 子项最外层布局
         * @param position
         * @return 当前视图
         */
        @NonNull
        @Override
        public Object instantiateItem(@NonNull ViewGroup container, int position) {
            /*
            mViews.get(position) 找到当前视图
             */
            View child=mViews.get(position);
            container.addView(child);//把view加载进去了
            return child;
        }

        /**
         * 释放视图
         * @param container
         * @param position
         * @param object
         */
        @Override
        public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
            container.removeView(mViews.get(position));
        }
    };


}


四、代码解释

1、

    private ViewPager mViewPager;
    
    private int[] mLayoutIDs={
            R.layout.view_first,
            R.layout.view_second,
            R.layout.view_third
    };

    private List<View> mViews;
 

viewPager:<androidx.viewpager.widget.ViewPager/>控件。

mLayoutIDs:对应的是三个layout组成的数组

mViews:View数组,之后装的是三个layout对应的三个View(视图)

2、初始化过程

mViewPager = (ViewPager)findViewById(R.id.view_pager);

        mViews = new ArrayList<>();

        for (int index = 0; index < mLayoutIDs.length ; index++) {
            final View view = getLayoutInflater().inflate(mLayoutIDs[index], null);
            mViews.add(view);//快捷键:opt+cmd+V 提取参数
        }

3、PageAdapter——ViewPager的适配器

在ListView中也有适配器,ListView通过重写GetView()函数来获取当前要加载的Item。

而PageAdapter不太相同,毕竟PageAdapter是单个VIew的合集。

PageAdapter 必须重写的四个函数:

  • boolean isViewFromObject(View arg0, Object arg1)
  • int getCount() 
  • void destroyItem(ViewGroup container, int position,Object object)
  • Object instantiateItem(ViewGroup container, int position)

返回要滑动的VIew的个数

    @Override
     public int getCount() {
            return mLayoutIDs.length;
     }

从当前container中删除指定位置(position)的View

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

做了两件事,第一:将当前视图添加到container中,第二:返回当前(position的)View

@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
    /*
    mViews.get(position) 找到当前视图
     */
    View child=mViews.get(position);
    container.addView(child);//把view加载进去了
    return child;
}

判断instantiateItem(ViewGroup, int)函数所返回来的Key与一个页面视图是否是代表的同一个视图(即它俩是否是对应的,对应的表示同一个View)

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

发布了34 篇原创文章 · 获赞 5 · 访问量 7470

猜你喜欢

转载自blog.csdn.net/qq_39438055/article/details/104174443
今日推荐