效果图
一、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;
mViewPager:<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;
}