当前位置: 首页 > news >正文

Android 控件 - ViewPager 的适配器(PagerAdapter、FragmentPagerAdapter、FragmentStatePagerAdapter)

ViewPager 概述

  1. ViewPager 是 Android 中实现页面滑动切换的经典组件

  2. ViewPager 有如下适配器

适配器说明
PagerAdapter用于将任意类型的视图与 ViewPager 绑定,自由度最高
FragmentPagerAdapter当页面数量较少,且所有 Fragment 都希望常驻内存、不会被销毁时使用
FragmentStatePagerAdapter当页面数量很多,,或者 Fragment 可能动态增删时使用
  1. ViewPager2 是 ViewPager 升级版

一、PagerAdapter

1、Adapter
  • view_pager_item_image.xml
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:app="http://schemas.android.com/apk/res-auto"android:layout_width="match_parent"android:layout_height="match_parent"><ImageViewandroid:id="@+id/iv_image"android:layout_width="200dp"android:layout_height="200dp"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout>
  • ImagePagerAdapter.kt
classImagePagerAdapter(privatevalcontext:Context,privatevalimages:List<Int>):PagerAdapter(){privatevalinflater:LayoutInflater=LayoutInflater.from(context)overridefungetCount():Int{returnimages.size}overridefunisViewFromObject(view:View,`object`:Any):Boolean{returnview===`object`}overridefuninstantiateItem(container:ViewGroup,position:Int):Any{valview=inflater.inflate(R.layout.view_pager_item_image,container,false)valivImage=view.findViewById<ImageView>(R.id.iv_image)ivImage.setImageResource(images[position])container.addView(view)returnview}overridefundestroyItem(container:ViewGroup,position:Int,`object`:Any){super.destroyItem(container,position,`object`)container.removeView(`object`asView)}}
2、Activity
  • activity_view_pager_test.xml
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns: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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ViewPagerTestActivity"><androidx.viewpager.widget.ViewPagerandroid:id="@+id/vp_content"android:layout_width="match_parent"android:layout_height="370dp"android:background="#f5f5f5"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout>
  • ViewPagerTestActivity.kt
classViewPagerTestActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_view_pager_test)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)){v,insets->valsystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom)insets}valvpContent=findViewById<ViewPager>(R.id.vp_content)vpContent.adapter=ImagePagerAdapter(this,listOf(R.drawable.image1,R.drawable.image2))}}

二、FragmentPagerAdapter

1、Adapter
  • MyFragmentPagerAdapter.kt
classMyFragmentPagerAdapter(fm:FragmentManager,privatevalfragments:List<Fragment>,privatevaltitles:List<String>):FragmentPagerAdapter(fm){overridefungetCount():Int{returnfragments.size}overridefungetItem(position:Int):Fragment{returnfragments[position]}overridefungetPageTitle(position:Int):CharSequence?{returntitles[position]}}
2、Fragment
  • fragment_home.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="首页页面"android:textSize="24sp"/><Buttonandroid:id="@+id/btn_open"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_marginTop="20dp"android:text="打开"/></LinearLayout>
  • HomeFragment.kt
publicclassHomeFragment extends Fragment{@OverridepublicViewonCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){returninflater.inflate(R.layout.fragment_home,container,false);}@OverridepublicvoidonViewCreated(@NonNullView view,@NullableBundle savedInstanceState){super.onViewCreated(view,savedInstanceState);Button btnOpen=view.findViewById(R.id.btn_open);btnOpen.setOnClickListener(v->{Toast.makeText(getActivity(),"test content",Toast.LENGTH_LONG).show();});}}
  • fragment_discover.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="发现页面"android:textSize="24sp"/></LinearLayout>
  • DiscoverFragment.kt
publicclassDiscoverFragment extends Fragment{@OverridepublicViewonCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){returninflater.inflate(R.layout.fragment_discover,container,false);}}
  • fragment_profile.xml
<?xml version="1.0" encoding="utf-8"?><LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"android:layout_width="match_parent"android:layout_height="match_parent"android:gravity="center"android:orientation="vertical"><TextViewandroid:layout_width="wrap_content"android:layout_height="wrap_content"android:text="个人页面"android:textSize="24sp"/></LinearLayout>
  • ProfileFragment.kt
publicclassProfileFragment extends Fragment{@OverridepublicViewonCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState){returninflater.inflate(R.layout.fragment_profile,container,false);}}
3、Activity
  • activity_view_pager_test.xml
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns: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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ViewPagerTestActivity"><androidx.viewpager.widget.ViewPagerandroid:id="@+id/vp_content"android:layout_width="match_parent"android:layout_height="370dp"android:background="#f5f5f5"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout>
  • ViewPagerTestActivity.kt
classViewPagerTestActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_view_pager_test)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)){v,insets->valsystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom)insets}valvpContent=findViewById<ViewPager>(R.id.vp_content)vpContent.adapter=MyFragmentPagerAdapter(supportFragmentManager,listOf(HomeFragment(),DiscoverFragment(),ProfileFragment()),listOf("Home","Discover","Profile"))}}

三、FragmentStatePagerAdapter

1、Adapter
  • NewsStatePagerAdapter.kt
classNewsStatePagerAdapter(fm:FragmentManager,privatevalcategories:List<String>):FragmentStatePagerAdapter(fm){overridefungetCount():Int{returncategories.size}overridefungetItem(position:Int):Fragment{returnNewsFragment.newInstance(categories[position])}overridefungetPageTitle(position:Int):CharSequence?{returncategories[position]}}
2、Fragment
  • NewsFragment.kt
class NewsFragment : Fragment() { companion object { fun newInstance(category: String): NewsFragment { return NewsFragment().apply { arguments = Bundle().apply { putString("category", category) } } } } override fun onCreateView( inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle? ): View? { return TextView(requireContext()).apply { text = arguments?.getString("category") ?: "无" textSize = 24f gravity = Gravity.CENTER } } }
3、Activity
  • activity_view_pager_test.xml
<?xml version="1.0" encoding="utf-8"?><androidx.constraintlayout.widget.ConstraintLayoutxmlns: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:id="@+id/main"android:layout_width="match_parent"android:layout_height="match_parent"tools:context=".ViewPagerTestActivity"><androidx.viewpager.widget.ViewPagerandroid:id="@+id/vp_content"android:layout_width="match_parent"android:layout_height="370dp"android:background="#f5f5f5"app:layout_constraintBottom_toBottomOf="parent"app:layout_constraintEnd_toEndOf="parent"app:layout_constraintStart_toStartOf="parent"app:layout_constraintTop_toTopOf="parent"/></androidx.constraintlayout.widget.ConstraintLayout>
  • ViewPagerTestActivity.kt
classViewPagerTestActivity:AppCompatActivity(){overridefunonCreate(savedInstanceState:Bundle?){super.onCreate(savedInstanceState)enableEdgeToEdge()setContentView(R.layout.activity_view_pager_test)ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)){v,insets->valsystemBars=insets.getInsets(WindowInsetsCompat.Type.systemBars())v.setPadding(systemBars.left,systemBars.top,systemBars.right,systemBars.bottom)insets}valvpContent=findViewById<ViewPager>(R.id.vp_content)vpContent.adapter=NewsStatePagerAdapter(supportFragmentManager,listOf("推荐","热点","科技","体育","娱乐"))}}
http://www.jsqmd.com/news/977891/

相关文章:

  • 2026年5月五金数控车铣零部件厂商排行实测盘点:不锈钢格栅、不锈钢钣金件、不锈钢雨水算子、五金冲压件定制、五金折弯件选择指南 - 优质品牌商家
  • 国标权威认证加持|融景科技斩获两项国家级一级行业资质、两项底层自研软著,定义 AI 搜索优化技术标准 - 广东科技观察
  • 5步实现IPX协议兼容:让经典游戏在现代Windows系统重生
  • 保姆级避坑指南:从离线镜像到VSCode调试,搞定gem5 GCN3 Docker环境全流程
  • RAG实战面试避坑指南:从Demo到系统设计的进阶秘籍
  • 芜湖黄金回收选购全攻略:芜湖附件黄金回收、芜湖首饰回收、芜湖首饰维修、芜湖黄金上门回收、芜湖K金回收、芜湖专业贵金属回收选择指南 - 优质品牌商家
  • 口碑最好的AI论文写作软件推荐(从文献整理到论文成稿全流程)适合全体毕业生
  • 聊聊为什么 AI 时代需要一个Token流量网关?
  • Python开发进阶之路:掌握高级技巧与最佳实践
  • 2026年数控折弯机专业定制制造商口碑排名,武嘉数控上榜 - mypinpai
  • 2026数控齿轮倒角机实测评测:浙江链笼倒角机、浙江齿条倒角机、齿条磨棱倒角机、数控齿轮倒角机、法兰倒角机、浙江球笼倒角机选择指南 - 优质品牌商家
  • 从TI DSP到NXP Arm MCU的电机控制平台迁移实战指南
  • config/WebMvcConfig.java
  • 3步搭建私人云游戏服务器:Sunshine游戏串流平台完全指南
  • 通化古董古玩回收商家甄选:通化市钱币古董回收/通化市钻石回收/通化老酒名酒回收/通化老钱币古董回收/通化高端名表回收/选择指南 - 优质品牌商家
  • MATLAB处理地理TIF数据踩过的坑:geotiffread与imread区别、地理信息丢失怎么办?
  • 2026年10款论文降AIGC工具实测:从90%降至10%的硬核之选
  • 2026年武嘉数控好用吗? - mypinpai
  • Java里给数字‘美颜’:手把手教你用DecimalFormat定制百分比、货币和千分位显示
  • 2026兰州工业提升门厂家TOP5推荐:兰州工业门价格、兰州工业门厂商、兰州工业门厂家、兰州工业门厂家电话、兰州工业门批发选择指南 - 优质品牌商家
  • 影响交换机箱体使用寿命的几个关键因素
  • SNN实战避坑:在1核4G云服务器上跑MNIST,我的权重文件和Theta值都存对了么?
  • 四川车间隔音降噪厂家排行:四川水泥厂噪音治理/四川水泵房噪音治理/四川水泵隔音降噪/四川空调噪音治理/四川空调外机隔音降噪/选择指南 - 优质品牌商家
  • IDEA条件断点实战:让循环调试不再‘刷屏’,精准捕捉Bug瞬间
  • 如何突破网盘下载限速:LinkSwift直链下载助手的完整实战指南
  • 飞书文档转Markdown:如何用Go语言实现企业级文档迁移方案
  • 2026广州高口碑搬家公司盘点:本地街坊邻居从询价到入住的全景实录 - 从来都是英雄出少年
  • 5 家权威测评认证——典典佳汇黄金 名酒回收双榜第一,靠谱实力全城公认! - 诚鑫名品
  • 3分钟快速配置开源音乐库:打造你的专属高品质音乐系统
  • FRED应用:锥透镜的设计