安卓学习笔记之--------ViewPager控件

目录

 

一、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 个步骤:

  1. 添加 ViewPager
  2. 为 ViewPager 创建 Adapter
  3. 将 ViewPager 和 Adapter 绑定

二、ViewPager的适配器

ViewPager有三种适配器,分别是:

  • PagerAdapter
  • FragmentPagerAdapter
  • FragmentStatePagerAdapter

其中PagerAdapter是FragmentPagerAdapter和FragmentStatePagerAdapter的基类。

 

1. PagerAdapter 

当我们自定义的适配器继承PagerAdapter时,必须实现以下三个方法:

  • instantiateItem(ViewGroup,int)     返回要显示的视图view,第一个参数是容器,第二个参数是position,即把position对应位置的view加入到容器中。并返回该view.在每次 ViewPager 需要一个用以显示的 Object 的时候,该函数都会被 ViewPager.addNewItem( )调用。
  • 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 

           

程序运行效果:

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值