【Android】ViewPager基本用法总结

news2024/9/24 19:24:48

文章目录

  • 一、添加ViewPager控件
  • 二、构建适配器类
  • 三、在 MainActivity 中设置适配器
    • 示例一:图片切换
      • 适配器
      • MainActivity
    • 示例二:Fragment切换
      • 适配器
      • Fragment
      • MainActivity

ViewPager 是 Android 中一个用于在同一屏幕上滑动不同页面(通常是左右滑动)的组件。它通常用于实现多页面滑动效果,比如应用的引导页、图片轮播、以及支持标签导航的界面。

ViewPagerPagerAdapter 结合使用。PagerAdapter 是一个适配器,它负责为 ViewPager 提供页面内容。每个页面通常是一个 Fragment,也可以是一个普通的 View

特点:

  1. 滑动效果ViewPager 允许用户通过滑动手势在不同页面之间切换。
  2. 缓存页面:默认情况下,ViewPager 会缓存当前页面的前一页和后一页,以提高 滑动性能。
  3. 与TabLayout结合ViewPager 常常与 TabLayout 配合使用,实现顶部标签栏导航。

一、添加ViewPager控件

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout 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:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity">

    <androidx.viewpager.widget.ViewPager
        android:id="@+id/viewPager"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</androidx.constraintlayout.widget.ConstraintLayout>

二、构建适配器类

image-20240904200221023

继承PagerAdapter并实现4个方法:

getCountdestroyIteminstantiateItemisViewFromObject

public class MyViewPagerAdapter extends PagerAdapter {

    @Override
    public int getCount() {
        return 0;
    }

    @Override
    public void destroyItem(@NonNull View container, int position, @NonNull Object object) {
        super.destroyItem(container, position, object);
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull View container, int position) {
        return super.instantiateItem(container, position);
    }

    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return false;
    }
}

image-20240904201150661

三、在 MainActivity 中设置适配器

示例一:图片切换

适配器

public class MyViewPagerAdapter extends PagerAdapter {
    List<ImageView> mImageViewList;

    public MyViewPagerAdapter(List<ImageView> mImageViewList) {
        this.mImageViewList = mImageViewList;
    }

    @Override
    public int getCount() {
        return mImageViewList == null ? 0 : mImageViewList.size();
    }


    @Override
    public boolean isViewFromObject(@NonNull View view, @NonNull Object object) {
        return view == object;
    }

    @NonNull
    @Override
    public Object instantiateItem(@NonNull ViewGroup container, int position) {
        container.addView(mImageViewList.get(position));
        return mImageViewList.get(position);
    }

    // 该方法需删除super方法,否则会报错闪退
    @Override
    public void destroyItem(@NonNull ViewGroup container, int position, @NonNull Object object) {
        container.removeView((View) object);
    }
}

MainActivity

public class MainActivity extends AppCompatActivity {
    private MyViewPagerAdapter myViewPagerAdapter;
    private ViewPager viewPager;
    List<ImageView> imageViewsList;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        viewPager = findViewById(R.id.viewPager);

        initData();
        myViewPagerAdapter = new MyViewPagerAdapter(imageViewsList);
        viewPager.setAdapter(myViewPagerAdapter);
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {

            }

            @Override
            public void onPageSelected(int position) {
                Toast.makeText(MainActivity.this, "当前页面为:" + (position + 1), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPageScrollStateChanged(int state) {

            }
        });
    }

    private void initData() {
        ImageView imageView1 = new ImageView(this);
        imageView1.setImageResource(R.drawable.p1);
        ImageView imageView2 = new ImageView(this);
        imageView2.setImageResource(R.drawable.p2);
        ImageView imageView3 = new ImageView(this);
        imageView3.setImageResource(R.drawable.p3);

        imageViewsList = new ArrayList<>();
        imageViewsList.add(imageView1);
        imageViewsList.add(imageView2);
        imageViewsList.add(imageView3);
    }
}

Screenrecorder-2024-_-original-original

示例二:Fragment切换

适配器

与图片类似,List存储的为Fragment,并且自定义适配器类继承FragmentPagerAdapter

只用实现两个方法getItemgetCount

public class MyFragmentVPAdapter extends FragmentPagerAdapter {
    List<Fragment> myFragmentList;

    public MyFragmentVPAdapter(@NonNull FragmentManager fm, List<Fragment> fragmentList) {
        super(fm);
        this.myFragmentList = fragmentList;
    }

    @NonNull
    @Override
    public Fragment getItem(int position) {
        return myFragmentList == null ? null : myFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return myFragmentList == null ? 0 : myFragmentList.size();
    }
}

Fragment

这里省略部分代码和fragmentlayout,只放了一个TextView

这里通过param1参数传递信息来设置fragment样式

public class VPFragment extends Fragment {

    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    private String mParam1;
    private String mParam2;

    private TextView textView;
    
    public static VPFragment newInstance(String param1, String param2) {
        VPFragment fragment = new VPFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onViewCreated(@NonNull View view, @Nullable Bundle savedInstanceState) {
        super.onViewCreated(view, savedInstanceState);
        
        textView = view.findViewById(R.id.tv);
        textView.setText(mParam1);
    }
}

MainActivity

public class MainActivity extends AppCompatActivity {
    // 声明 ViewPager 和自定义 Fragment 适配器
    private ViewPager viewPager;
    private MyFragmentVPAdapter mFragmentVPAdapter;
    List<Fragment> mFragmentList; // 存储 Fragment 的列表

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        // 绑定布局文件中的 ViewPager 控件
        viewPager = findViewById(R.id.viewPager);

        // 初始化 Fragment 数据
        initData();

        // 创建适配器实例并将其设置给 ViewPager
        mFragmentVPAdapter = new MyFragmentVPAdapter(getSupportFragmentManager(), mFragmentList);
        viewPager.setAdapter(mFragmentVPAdapter);

        // 为 ViewPager 添加页面变化监听器
        viewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
            @Override
            public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
                // 当页面正在滑动时调用,可以获取滑动的进度
            }

            @Override
            public void onPageSelected(int position) {
                // 当新页面被选中时调用,显示当前页面索引的 Toast
                Toast.makeText(MainActivity.this, "这是碎片" + (position + 1), Toast.LENGTH_SHORT).show();
            }

            @Override
            public void onPageScrollStateChanged(int state) {
                // 当页面滑动状态改变时调用,比如静止、拖动、自动滑动状态
            }
        });
    }

    // 初始化 Fragment 列表的方法
    private void initData() {
        mFragmentList = new ArrayList<>(); // 创建一个存储 Fragment 的列表

        // 创建并初始化多个 VPFragment 实例,每个 Fragment 对应一个页面
        VPFragment vpFragment1 = VPFragment.newInstance("这是碎片1", "");
        VPFragment vpFragment2 = VPFragment.newInstance("这是碎片2", "");
        VPFragment vpFragment3 = VPFragment.newInstance("这是碎片3", "");

        // 将 Fragment 添加到列表中
        mFragmentList.add(vpFragment1);
        mFragmentList.add(vpFragment2);
        mFragmentList.add(vpFragment3);
    }
}


感谢您的阅读
如有错误烦请指正


参考:

  1. 36.3-ViewPager结合Fragment_哔哩哔哩_bilibili

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2110430.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C++】C++中的花式操作:lambda表达式、类成员初始化列表、三元运算符、运算符及其重载。。。

八、C中的花式操作&#xff1a;lambda表达式、构造函数初始化列表、三元运算符 10、lambda表达式 见mutable关键字&#xff1a;【C】C中的关键字&#xff1a;const、mutable、auto、new....-CSDN博客。 11、构造函数初始化列表 当我们编写一个类时&#xff0c;一般都要有一个…

鼠标指针美化 一大批鼠标指针特效 喜欢的快点收藏~!

鼠标指针美化 一大批鼠标指针特效 喜欢的快点收藏~&#xff01;鼠标指针美化&#xff0c;这个功能可能许多人都没用过&#xff0c;应该还有很多人都是用着系统默认的鼠标指针&#xff0c;我们今天给大家分享一个可以修改鼠标指针的工具&#xff0c;如果你也喜欢&#xff0c;那麻…

类比推理-错题集

001 解析 &#xff1a; 002

[Visual Stuidio 2022使用技巧]3.模板

本文主要介绍本人在使用vs2022开发WPF桌面程序时使用到的一些插件及配置。 语言&#xff1a;C# IDE&#xff1a;Microsoft Visual Studio Community 2022 框架&#xff1a;WPF&#xff0c;.net 8.0 一、工程模板 1.1 创建模板 编辑好模板代码&#xff0c;扩展及NuGet包之…

【2024全国大学生数学建模竞赛】E题 模型建立与求解(含代码与论文)

目录 一、问题重述 1.1 问题背景 1.2 问题回顾与分析 四、问题求解与分析 4.1 问题1求解与分析 4.1.1 问题1分析 4.1.2 问题1建模与求解 按照提交论文的格式进行撰写&#xff01;完整版请看文章最后&#xff01; 一、问题重述 1.1 问题背景 随着城市化进程的加快、机动…

mysql笔记3(数据库和表的基础操作)

文章目录 一、数据库的基础操作1. 显示所有的仓库(数据库)2. 创建数据库注意(命名规范)&#xff1a; 3. 删除数据库4. 查看创建数据库的SQL5. 创建数据库时跟随字符编码6. 修改数据库的字符编码 二、表的基础操作1. 引入表的思维2. 引用数据库3. 查看该数据库下面的表4. 创建表…

微信小程序webgl 显示图片

// wxml <view class"container"><!-- 加载地图容器 --><canvas type"webgl" id"testMap" style"width: 100%; height: 100%;" disable-scroll bindtouchstart"touchStart" bindtouchmove"touchMove&qu…

直播美颜SDK与主播美颜工具:实时美颜技术的深度解析

本篇文章&#xff0c;笔者将深入解析直播美颜SDK的核心技术与主播美颜工具的开发原理。 一、什么是直播美颜SDK&#xff1f; 通过集成美颜SDK&#xff0c;开发者可以在直播应用中快速实现脸部优化、滤镜添加、皮肤调整等功能&#xff0c;帮助主播在直播过程中实时呈现最佳状态…

linux线程cp模型,posix信号量,线程池,线程封装,单例模型,懒汉饿汉实现方式,自旋锁,读者写者模型

1.生产者消费者模型 前面的同步&#xff0c;我们并没有一个很好的场景来模拟同步&#xff0c;只是简单的将有序的现象输出出来&#xff1b;现在我们来讲解一个比较合理且常见的模型——生产者消费者模型&#xff1b; 1.1模型理解 什么是生产者消费者模型&#xff1a; 这个模…

书籍爱好者的福音:Spring Boot实现的个性化推荐

1 绪论 1.1研究背景 随着网络不断的普及发展&#xff0c;图书个性化推荐系统依靠网络技术的支持得到了快速的发展&#xff0c;首先要从学生的实际需求出发&#xff0c;通过了解学生的需求开发出具有针对性的首页、图书信息、好书推荐、留言反馈、个人中心、后台管理功能&#x…

Go Web 编程 PDF

&#x1f4da; Go Web开发必读:《Building Web Applications with Go》PDF资源分享 &#x1f50d; 找寻良久,终于寻得这本珍贵资源!现在我免费分享给大家 你是否正在学习Go语言开发Web应用?是否想要提升Go并发编程能力?这本书绝对不容错过! &#x1f4d6; 关于这本书 《B…

AC访问规则--规则优先级

按照以下进行优先级排序&#xff1a; 1.Specific Rules Have Priority 特定规则是一种关联以下内容的规则&#xff1a; ・通过指定其 AID 或指定隐式选择的应用来关联安全元件应用&#xff0c;并且 ・通过指定其 DeviceAppID 来解释一个设备应用&#xff0c; 通用规则是适用…

力扣1049-最后一块石头的重量II(Java详细题解)

题目链接&#xff1a;1049. 最后一块石头的重量 II - 力扣&#xff08;LeetCode&#xff09; 前情提要&#xff1a; 因为本人最近都来刷dp类的题目所以该题就默认用dp方法来做。 最近刚学完01背包&#xff0c;所以现在的题解都是以01背包问题为基础再来写的。 如果大家不懂…

Xilinx高速接口文档简介

Xilinx的高速资源手册比较详细的介绍的介绍有ug482-GTP&#xff0c;ug486-GTX&#xff0c;ug576-GTH 基本结构资源和原语都大致相同 GTP主要在A系列芯片中 GTX主要在K系列芯片中 XILINX系列中有专用的高速接口资源&#xff0c;这些也是FPGA中最有价值的存在。 这些高速资源被称…

springboot小儿推拿培训系统

基于springbootvue实现的小儿推拿培训系统 &#xff08;源码L文ppt&#xff09;4-50 3系统设计 3.1系统功能结构 系统结构图可以把杂乱无章的模块按照设计者的思维方式进行调整排序&#xff0c;可以让设计者在之后的添加&#xff0c;修改程序内容的过程…

网传“有手就能过”的PMP,是不是真的那么水?!

“PMP真的很简单啊&#xff0c;我都没有复习就刷刷题就过了。” “3A上岸&#xff0c;就刷了两天题就直接去考了。” “感觉真的就是花钱随便过&#xff0c;我还以为多难呢&#xff0c;一次就考过了。” …… 上面这样的发言你是不是在好多平台都见过&#xff1f; 你是不是也在…

SAP HCM 如何计算缺勤实数

导读 INTRODUCTION 缺勤实数&#xff1a;这几天好几个朋友问题有什么办法可以计算出缺勤的时长&#xff0c;因为计算时长需要和排班去匹配&#xff0c;所以逻辑复杂度还是比较高的&#xff0c;希望有标准的函数能完成。其实SAP有个标准的函数可以完成&#xff0c;复杂的时候填…

合宙Air780E硬件设计手册02

上文文主要介绍了Air780E的硬件设计中的的应用接口部分。 上文链接&#xff1a;Air780E低功耗4G模组硬件设计手册01-CSDN博客 在本文我们会继续介绍Air780E的硬件设计介绍。 二、应用接口 2.10 SIM卡接口 Air780E支持2路SIM卡接口&#xff0c;支持ETSI和IMT-2000卡规范&am…

P0.9全倒装COB超微小间距LED显示技术的优势

P0.9全倒装COB&#xff08;Chip On Board&#xff09;超微小间距LED显示技术&#xff0c;以其前所未有的精细度与卓越性能&#xff0c;正逐步引领显示行业迈向新的纪元。这项技术不仅极大地缩小了LED灯珠之间的间距&#xff0c;实现了像素点的极致密集排列&#xff0c;更通过全…

修复msvcp100.dll文件丢失的问题,如何高效率修复msvcp100.dll

在Windows操作系统中&#xff0c;msvcp100.dll是Microsoft Visual C 2010 Redistributable Package的一部分&#xff0c;它支持多种与C库相关的关键功能。这个文件对于许多程序的正常运行非常重要。有时用户可能会遇到msvcp100.dll文件缺失的问题&#xff0c;这会导致某些程序无…