概述
ViewPager就是一个简单的页面切换组件,可以往里面填充多个View,然后可以通过滑动来切换到不同的View,它和ListView、GridView一样需要适配器,对于ViewPager有一个特定的适配器PagerAdapter。
然后根据官方推荐,填充的View最好使用Fragment,方便管理。对于Fragment也有两个特定的适配器FragmentPagerAdapter和FragmentStatePagerAadapter。
对于FragmentPagerAdapter而言最多只能加载三个页面,即当有页面1,2,3,4时:
若处在页面1,则只加载页面1,2
若处在页面2,则只加载页面1,2,3
若处在页面3,则销毁页面1,加载页面2,3,4
若处在页面4,则销毁页面2,加载页面3,4
对于FragmentStatePagerAdapter而言,当Fragment不为用户所见时,该Fragment会被销毁,并保存Frament的状态,当要显示该Fragment时再生成新的页面。
PagerAdapter的使用
使用PagerAdaper实现三个Activity的切换
创建三个view_num.xml
如:view_one.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"
android:gravity="center"
android:background="#00ff00">
<TextView
android:id="@+id/view_one"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是第一个界面"
android:gravity="center_horizontal"
android:textStyle="bold"
android:textSize="26sp"
android:textColor="#ff0000"/>
</LinearLayout>
main_activity.xml
<?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/vpager_one"
android:layout_height="match_parent"
android:layout_width="match_parent"/>
</LinearLayout>
自定义适配器MyPagerAdapter
package com.example.adapter;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import androidx.annotation.NonNull;
import androidx.viewpager.widget.PagerAdapter;
import java.util.List;
public class MyPagerAdapter extends PagerAdapter {
private List<View> list;
public MyPagerAdapter() {
}
public MyPagerAdapter(List<View> list) {
super();
this.list = list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view==object;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(list.get(position));
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(list.get(position));
return list.get(position);
}
}
MainActivity
package com.example;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import com.example.adapter.MyPagerAdapter;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewPager vpager_one;
private List<View> list;
private MyPagerAdapter myPagerAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
vpager_one = findViewById(R.id.vpager_one);
list = new ArrayList<View>();
LayoutInflater li = getLayoutInflater();
list.add(li.inflate(R.layout.view_one,null,false));
list.add(li.inflate(R.layout.view_two,null,false));
list.add(li.inflate(R.layout.view_three,null,false));
myPagerAdapter = new MyPagerAdapter(list);
vpager_one.setAdapter(myPagerAdapter);
}
}
标题栏——PagerTitleStrip与PagerTabStrip
PagerTabStrip有下划线,PagerTitleStrip没有
实现切换页面的同时切换标题
activity_two.xml
<?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"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#CCFF99"
android:gravity="center"
android:text="PagerTitleStrip效果演示"
android:textColor="#000000"
android:textSize="26sp"/>
<androidx.viewpager.widget.ViewPager
android:id="@+id/vpager_two"
android:layout_height="match_parent"
android:layout_width="match_parent">
<androidx.viewpager.widget.PagerTitleStrip
android:id="@+id/pagertitle"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_gravity="top"/>
</androidx.viewpager.widget.ViewPager>
</LinearLayout>
activity_three.xml
<?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"
android:orientation="vertical"
tools:context=".MainActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="48dp"
android:background="#CCFF99"
android:gravity="center"
android:text="PagerTitleTab效果演示"
android:textColor="#000000"
android:textSize="26sp"/>
<androidx.viewpager.widget.ViewPager
android:id="@+id/vpager_two"
android:layout_height="match_parent"
android:layout_width="match_parent">
<androidx.viewpager.widget.PagerTabStrip
android:id="@+id/pagertitle"
android:layout_width="wrap_content"
android:layout_height="40dp"
android:layout_gravity="top"/>
</androidx.viewpager.widget.ViewPager>
</LinearLayout>
三个view_num.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"
android:gravity="center"
android:background="#00ff00">
<TextView
android:id="@+id/view_one"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="这是第一个界面"
android:gravity="center_horizontal"
android:textStyle="bold"
android:textSize="26sp"
android:textColor="#ff0000"/>
</LinearLayout>
自定义适配器,重写 getPageTitle(int position)方法
package com.example.adapter;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.viewpager.widget.PagerAdapter;
import java.util.List;
public class MyPagerAdapter2 extends PagerAdapter {
private List<View> list;
private List<String> titleList;
public MyPagerAdapter2() {
}
public MyPagerAdapter2(List<View> list,List<String> titleList) {
super();
this.list = list;
this.titleList = titleList;
}
@Nullable
@Override
public CharSequence getPageTitle(int position) {
return titleList.get(position);
}
@Override
public int getCount() {
return list.size();
}
@Override
public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
return view==object;
}
@Override
public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
container.removeView(list.get(position));
}
@NonNull
@Override
public Object instantiateItem(@NonNull ViewGroup container, int position) {
container.addView(list.get(position));
return list.get(position);
}
}
MainActivity,加载的是activity_two布局
package com.example;
import androidx.appcompat.app.AppCompatActivity;
import androidx.viewpager.widget.ViewPager;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import com.example.adapter.MyPagerAdapter;
import com.example.adapter.MyPagerAdapter2;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends AppCompatActivity {
private ViewPager vpager_two;
private List<View> list;
private List<String> sTitleList;
private MyPagerAdapter2 myPagerAdapter2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_two);
vpager_two = findViewById(R.id.vpager_two);
list = new ArrayList<View>();
sTitleList = new ArrayList<>();
LayoutInflater li = getLayoutInflater();
list.add(li.inflate(R.layout.view_one,null,false));
list.add(li.inflate(R.layout.view_two,null,false));
list.add(li.inflate(R.layout.view_three,null,false));
sTitleList.add("橘黄");
sTitleList.add("淡黄");
sTitleList.add("浅棕");
myPagerAdapter2 = new MyPagerAdapter2(list,sTitleList);
vpager_two.setAdapter(myPagerAdapter2);
}
}