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

【Android】ViewPager2结合Fragment实现多页面滑动切换

一、什么是ViewPager2

ViewPager2 是 Android Jetpack 中的一个组件,用于在屏幕上实现可水平或垂直滑动的页面切换效果。它是早期 ViewPager 库的现代化替代品,解决了 ViewPager 的许多遗留问题并引入了强大的新功能。

你可以把它想象成一个可以左右(或上下)滑动的“相册”或者“引导页”,每一页都是一个独立的视图(Fragment 或 View),用户通过滑动手势在不同页面间切换。最常见的应用场景包括:

  • 应用引导页:新用户安装应用后的功能介绍幻灯片。

  • 图片浏览器/相册:全屏查看图片,滑动切换上一张/下一张。

  • 标签页:与 TabLayout 结合使用,实现类似 Chrome 浏览器顶部的标签页效果。

  • 新闻/文章详情流:滑动切换到下一篇新闻或文章。

相较于ViewPager的优点:

  • 垂直方向支持
    除了支持传统的水平分页之外,ViewPager2 还支持垂直分页。您可以通过设置 ViewPager2 元素的 android:orientation 属性为其启用垂直分页:
<androidx.viewpager2.widget.ViewPager2xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/pager"android:orientation="vertical" />
  • 从右到左支持

ViewPager2 支持从右到左 (RTL) 分页。系统会根据语言区域在适当的情况下自动启用 RTL 分页,不过您也可以通过设置 ViewPager2 元素的 android:layoutDirection 属性为其手动启用 RTL 分页:

<androidx.viewpager2.widget.ViewPager2xmlns:android="http://schemas.android.com/apk/res/android"android:id="@+id/pager"android:layoutDirection="rtl" />
  • 可修改的 Fragment 集合

ViewPager2 支持对可修改的 Fragment 集合进行分页浏览,在底层集合发生更改时调用 notifyDatasetChanged() 来更新界面。
这意味着,您的应用可以在运行时动态修改 Fragment 集合,而 ViewPager2 会正确显示修改后的集合。

二、ViewPager2结合Fragment使用

1.添加依赖

dependencies {implementation "androidx.viewpager2:viewpager2:1.0.0"
}

2.在布局文件中添加ViewPager2

<androidx.viewpager2.widget.ViewPager2android:id="@+id/viewPager2"android:layout_width="match_parent"android:layout_height="match_parent" />

3.创建要添加的Fragment及其布局文件

import androidx.fragment.app.Fragment;public class MainFragment extends Fragment {private static final String ARG_ID = "id";public static MainFragment newInstance(String id) {MainFragment fragment = new MainFragment();Bundle args = new Bundle();args.putString(ARG_ID, id);fragment.setArguments(args);return fragment;}// 完整的 Fragment 实现...
}

在其中编写newInstance方法,方便在Adapter中创建实例。

4.创建适配器

自定义Adapter继承 FragmentStateAdapter,重写getItemCount()和createFragment(position: Int)。

其中,getItemCount()返回 ViewPager2 中总共有多少页(即有多少个 Fragment);

createFragment(position: Int)根据给定的位置(position)创建并返回对应的 Fragment 实例。

import androidx.annotation.NonNull;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentActivity;
import androidx.viewpager2.adapter.FragmentStateAdapter;import java.util.List;public class DynamicFragmentStateAdapter extends FragmentStateAdapter {private final List<Data> dataList;public DynamicFragmentStateAdapter(@NonNull FragmentActivity fragmentActivity, List<Data> dataList) {super(fragmentActivity);this.dataList = dataList;}public DynamicFragmentStateAdapter(@NonNull Fragment fragment, List<Data> dataList) {super(fragment);this.dataList = dataList;}@NonNull@Overridepublic Fragment createFragment(int position) {// 获取当前位置的数据Data data = dataList.get(position);return MainFragment.newInstance(data);}@Overridepublic int getItemCount() {return dataList != null ? dataList.size() : 0;}// 可选:更新数据的方法public void updateData(List<Data> newDataList) {this.dataList.clear();this.dataList.addAll(newDataList);notifyDataSetChanged(); // 通知适配器数据已更改}
}

5.在Activity或Fragment中设置适配器

在Activity的onCreate()中设置,在Fragment的onCreateView()中设置。

 private ViewPager2 viewPager2;@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);viewPager2 = findViewById(R.id.view_pager);MainFragmentAdapter adapter = new MainFragmentAdapter(this);viewPager2.setAdapter(adapter);}
public class ParentFragment extends Fragment {private ViewPager2 viewPager2;@Overridepublic View onCreateView(@NonNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {View view = inflater.inflate(R.layout.fragment_parent, container, false);viewPager2 = view.findViewById(R.id.view_pager);MainFragmentAdapter adapter = new MainFragmentAdapter(this);viewPager2.setAdapter(adapter);return view;}
}


文章转载自:

http://KkGy2yaW.pccqr.cn
http://BOrZAXIb.pccqr.cn
http://RTXjDtXh.pccqr.cn
http://vAOGHHmx.pccqr.cn
http://yHv2peNR.pccqr.cn
http://VYypK66K.pccqr.cn
http://BfQzut3Q.pccqr.cn
http://K6icCBs1.pccqr.cn
http://ezQdypZl.pccqr.cn
http://vvNp4MzA.pccqr.cn
http://S0dkDVif.pccqr.cn
http://0zUll9eR.pccqr.cn
http://n440fJSZ.pccqr.cn
http://ObTsdTWT.pccqr.cn
http://2R1PkUrq.pccqr.cn
http://ZZLi6VNT.pccqr.cn
http://O1E7clq3.pccqr.cn
http://J5YP75Uh.pccqr.cn
http://KVo9cEMx.pccqr.cn
http://JoJnFeFS.pccqr.cn
http://eJXjybXE.pccqr.cn
http://JmzMOd6q.pccqr.cn
http://ObzASzQr.pccqr.cn
http://JfvR11HA.pccqr.cn
http://sdcpKXFT.pccqr.cn
http://L6wpgkKW.pccqr.cn
http://Kewe7fWv.pccqr.cn
http://7cQCqO4H.pccqr.cn
http://YGAEqO3p.pccqr.cn
http://XEnEhqI5.pccqr.cn
http://www.dtcms.com/a/370610.html

相关文章:

  • Spring Boot 3.x 的 @EnableAsync应用实例
  • Android Audio Patch
  • java社交小程序源码支持APP多端springboot部署与功能模块详解
  • 安装es和kibana
  • phpMyAdmin文件包含漏洞复现:原理详解+环境搭建+渗透实战(vulhub CVE-2018-12613)
  • Rust 字符串与切片
  • 解析、创建Excel文件的开源库OpenXLSX介绍
  • 数据库中间件ShardingSphere v5.2.1
  • 大模型推理时的加速思路?
  • (数据结构)哈希碰撞:线性探测法 vs 拉链法
  • 如何进行神经网络的模型训练(视频代码中的知识点记录)
  • Linux--命名管道
  • 【继承和派生】
  • IDEA修改系统缓存路径,防止C盘爆满
  • scikit-learn零基础配置(含python、anaconda)
  • 《sklearn机器学习——模型的持久性》joblib 和 pickle 进行模型保存和加载
  • 深入浅出 JVM 类加载器:分类、双亲委派与打破机制
  • ViGAS、RAF、DiFF-RIR论文解读
  • 《Science》神经炎症综述思路套用:从机制到跨领域研究范式
  • macOS下arm编译缺少stdint.h等问题
  • JP4-7-MyLesson后台前端(二)
  • 机器学习高级-day01-曲线拟合
  • JAVA同城打车小程序APP打车顺风车滴滴车跑腿源码微信小程序打车源码
  • CentOS系统管理:useradd命令的全面解析
  • 小智AI编译
  • 【FastDDS】Layer Transport ( 04-TCP Transport )
  • 文件操作和IO
  • leetcode LCR 159 库存管理III
  • 使用 TCMalloc 检查内存使用情况和内存泄漏
  • Altium Designer(AD24)加载License文件方法