目录
一、ViewPager是什么
二、ViewPager的适配器
1. PagerAdapter
2. FragmentPagerAdapter 和 FragmentPagerAdapter
三、例子:(以FragmentPagerAdapter适配器为例)
1. 创建主界面ViewPager的布局viewpager_main.xml :
2. 下一步编写主界面ViewPager的逻辑代码:ViewPagerActivity.kt
3. 在完成主界面的布局与逻辑编写后,再把主界面ViewPagerActivity加入到Androidmanifest.xml中
4. 定义要切换的界面的布局文件
一、ViewPager是什么
ViewPager可以实现界面的滑动切换。
如下:按着黄色区域往左拖动,即可滑动到第二个界面,按着紫色区域向前滑动也可以划回到黄色区域中。
要使用ViewPager,首先要用app 的 build.gradle文件中配置依赖:
dependencies {
implementation 'androidx.core:core-ktx:1.1.0'
implementation 'com.google.android.material:material:1.2.0-alpha01'
}
我们可以将 ViewPager 实现分成 3 个步骤:
- 添加 ViewPager
- 为 ViewPager 创建 Adapter
- 将 ViewPager 和 Adapter 绑定
二、ViewPager的适配器
ViewPager有三种适配器,分别是:
- PagerAdapter
- FragmentPagerAdapter
- FragmentStatePagerAdapter
其中PagerAdapter是FragmentPagerAdapter和FragmentStatePagerAdapter的基类。
1. PagerAdapter
当我们自定义的适配器继承PagerAdapter时,必须实现以下三个方法:
- instantiateItem(ViewGroup,int)
- destroyItem(ViewGroup,int,Object) 该方法的作用是从容器中移除一个给定position(位置)的视图
- isViewFromObject(View,Object) 这个方法是确定当前view的postition的,为了保持一致一般这个方法都直接返回view==object
- getCount() 这与RecyclerView适配器中的getItemCount是一样的,用于确认子项的数量
2. FragmentPagerAdapter 和 FragmentPagerAdapter
相比PagerAdapter,FragmentPagerAdapter和FragmentStatePagerAdapter更专注于每一页是Fragment的情况,而这两个子类适配器使用情况也是有区别的。FragmentPagerAdapter适用于页面比较少的情况,FragmentStatePagerAdapter适用于页面比较多的情况。
FragmentStatePagerAdapter中fragment实例在destroyItem的时候被真正释放,所以FragmentStatePagerAdapter省内存。FragmentPagerAdapter中的fragment实例在destroyItem的时候并没有真正释放fragment对象只是detach,所以FragmentPagerAdapter消耗更多的内存,带来的好处就是效率更高一些。所以得出这样的结论:FragmentPagerAdapter适用于页面比较少的情况,FragmentStatePagerAdapter适用于页面比较多的情况,因此不同的场合选择合适的适配器才是正确的做法
当我们自定义的适配器继承这两个适配器时,只需要重写以下两个方法即可运行:
- getItem(Int position) 在大多数情况下,都将调用 getItem() 来生成新的对象(例如Fragment)
- getCount() 此方法在上面已经介绍过
三、例子:(以FragmentPagerAdapter适配器为例)
1. 创建主界面ViewPager的布局viewpager_main.xml :
只需要给它添加创建一个简单的ViewPager即可
<?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">
<androidx.viewpager.widget.ViewPager
android:layout_width="200dp"
android:layout_height="200dp"
android:id="@+id/viewpager"
android:layout_gravity="center"
/>
</LinearLayout>
2. 下一步编写主界面ViewPager的逻辑代码:ViewPagerActivity.kt
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.fragment.app.Fragment
import com.ugc.andorid.landing.adapter.MyPagerAdapter
import com.ugc.andorid.landing.fragment.FragmentOne
import com.ugc.andorid.landing.fragment.FragmentTwo
import kotlinx.android.synthetic.main.viewpager_main.*
class ViewPagerActivity:AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.viewpager_main)
val fragmentList = listOf<Fragment>(FragmentOne(),FragmentTwo())
viewpager.adapter = MyPagerAdapter(supportFragmentManager,fragmentList) //view绑定adapter
}
}
从上面代码可以看到维护了一个fragmentList用于放2个Fragment,其实这两个Fragment就是用于显示和切换的,换句话说,这个demo运行起来,就一共有两个界面可以滑动,分别是FragmentOne 和 FragmentTwo。
且我们可以看到,MyPaperAdapter是需要传入一个参数 FragmentManager的,其实对于这个FragmentManament不用特别纠结,因为是用来管理 Fragment的,我们把它当参数传就是了。
3. 在完成主界面的布局与逻辑编写后,再把主界面ViewPagerActivity加入到Androidmanifest.xml中
在Androidmanifest.xml中加入这一段声明即可
4. 定义要切换的界面的布局文件
从3可以看到,这个demo项目一共就2个界面,分别是 FragmentOne 和 FragmentTwo,那么接下来就来定义一下这两个Fragment的布局和逻辑。
FragmentOne和FragmentTwo 两个界面的布局和逻辑都是大同小异的:
布局:
左边是 fragment_one.xml ,右边是 fragment_two.xml
逻辑:
左边是FragmentOne.kt 右边是 FragmentTwo.kt
程序运行效果: