ViewPager2一页展示多个Item且两边滑动

2023-11-07

ViewPager2一页展示多个Item且两边滑动

研究背景

在项目中有一个滚轮选择器的需求,对于小组件的研发,我一直倾向于自研,一方面功能不复杂,另一方面也锻炼自己的思维能力。不只是局限于上次研发。

传统Viewpager解决方法

对于传统的Viewpager的解决方法是

 <androidx.viewpager.widget.ViewPager
            android:layout_width="match_parent"
            android:clipToPadding="false"
            android:paddingLeft="10dp"
            android:paddingRight="10dp"
            android:gravity="center_horizontal"
            android:layout_height="300dp"/>

这个就可以了。

Viewpager2解决方法

布局上不能截断子类绘制

<androidx.viewpager2.widget.ViewPager2
        android:layout_width="match_parent"
        android:layout_height="135dp"
        android:clipChildren="false"
        android:orientation="vertical" />

代码上,需要捞出里面真正实现的RecyclerView

 		RecyclerView recyclerView = (RecyclerView) mPager.getChildAt(0);
        int padding = ScreenUtil.dip2px(45);
        recyclerView.setPadding(0, padding, 0, padding);
        recyclerView.setClipToPadding(false);

原理分析

Viewpager

如果我们查看源码,在Viewpager中

public class ViewPager extends ViewGroup {
    @Override
    public boolean onTouchEvent(MotionEvent ev) {
     	//做点击事件处理
     }
}

自己来实现所有Viewpager的功能,代码量巨大。我们的每个Item都是ViewpagerchildView

所以,我们做padding还有不截断,都是直接作用在childView上的。

Viewpager2

但是,在Viewpager2上是不一样的。

public final class ViewPager2 extends ViewGroup {
	//Java中默认私有的,所以直接拿不到
	RecyclerView mRecyclerView;
	
	//每个构造函数,都做了相同操作
	public ViewPager2(@NonNull Context context) {
        super(context);
        initialize(context, null);
    }
    
	//初始化方法
	private void initialize(Context context, AttributeSet attrs) {
		//已省略无用代码
        mRecyclerView = new RecyclerViewImpl(context);
        mLayoutManager = new LinearLayoutManagerImpl(context);
        mRecyclerView.setLayoutManager(mLayoutManager);
        setOrientation(context, attrs);
        mRecyclerView.setLayoutParams(
                new ViewGroup.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        attachViewToParent(mRecyclerView, 0, mRecyclerView.getLayoutParams());
    }
    
    //源码注释翻译
    //稍微修改了RecyclerView,以获得ViewPager行为在可访问性和启用/禁用用户滚动。
    private class RecyclerViewImpl extends RecyclerView {
        RecyclerViewImpl(@NonNull Context context) {
            super(context);
        }

        @RequiresApi(23)
        @Override
        public CharSequence getAccessibilityClassName() {
            if (mAccessibilityProvider.handlesRvGetAccessibilityClassName()) {
                return mAccessibilityProvider.onRvGetAccessibilityClassName();
            }
            return super.getAccessibilityClassName();
        }

        @Override
        public void onInitializeAccessibilityEvent(@NonNull AccessibilityEvent event) {
            super.onInitializeAccessibilityEvent(event);
            event.setFromIndex(mCurrentItem);
            event.setToIndex(mCurrentItem);
            mAccessibilityProvider.onRvInitializeAccessibilityEvent(event);
        }

        @SuppressLint("ClickableViewAccessibility")
        @Override
        public boolean onTouchEvent(MotionEvent event) {
            return isUserInputEnabled() && super.onTouchEvent(event);
        }

        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
            return isUserInputEnabled() && super.onInterceptTouchEvent(ev);
        }
    }
}

我们不用去分析里面怎么做的处理。其实很简单就能看出他是一种什么样的设计。

  • 在Viewpager2中,对RecyclerView进行了包装。RecyclerViewImpl 就是一个包装类。
  • 真正实现滑动行为的是里面的RecyclerView。而Viewpager2可以认为是另一个包装类,也是另一个容器。

所以,我们针对Viewpager2的解决方法就很好理解了。拿到里面真正盛放childViewRecyclerView。再进行paddingclip的设置。

总结

viewpager2的设计内部采用了RecyclerView,这个官方文档说的很清楚。但是,是采用包装的方式。优点在于有了RecyclerView很好用的复用机制。但是,无形中增加了一个页面层级。(这个缺点在优点面前,确实不算什么。但是需要知道。)

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ViewPager2一页展示多个Item且两边滑动 的相关文章

  • Xamarin MasterDetailPage 看起来很难看

    I m trying to create a MasterDetailPage and I am not quite sure if I am doing that right but the drawer master just look
  • Android - 材料设计 - NavigationView - 如何放置垂直滚动?

    我正在使用 NavigationViewcompile com android support design 22 2 1 嗯 一切都很好 除非它没有垂直滚动 如何通过xml设置呢 xml
  • 通知中的 showInputMethodPicker 在 Android 9 中不起作用

    我的应用程序有时会显示一条通知 以简化切换到应用程序的内部输入法的过程 因此 我正在执行 InputMethodManager getSystemService INPUT METHOD SERVICE showInputMethodPic
  • Android RecyclerView 空白

    我有一个 android 项目 我正在使用 Recycler 视图打印包含项目的列表 每个项目只有一个图像 并且在这些图像之间 android 正在创建一个很大的空白空间 我研究并看到即将将布局更改为wrap content 我更改了回收器
  • 未向 HAL 提供足够的数据,预期位置

    我在 Android Studio 中收到此错误 我只想在按下按钮时打印文本 我收到以下错误 每次按下按钮时都会出现该错误 如果我取消注释掉意图 它也可以正常工作 但是我拥有的代码越多 错误更改就越多 我实际上不确定这是真正的错误 我这么说
  • 带有真实颜色的图标显示黑色背景

    使用新主题 Theme MaterialComponents 在按钮上放置图标时会显示一个黑框 如何放置具有真实颜色的图标
  • Android Studio“等待调试器”

    我创建了简单的 你好 世界 使用 android studio 的项目 当我在设备或模拟器上运行它时 一切都很好 然后我尝试在调试模式下运行它 几分钟后屏幕上的 等待调试器 对话框失败并且 Error running test test U
  • Android OpenGL ES 支持无处不在?

    我需要了解如果我选择在 OpenGL 而不是 android graphics 中的 android 原生 2D 图形 API 进行绘图 我会损失多少潜在安装量 android 文档似乎暗示 OpenGL ES API 基本上在所有手机上都
  • 底页横向问题

    在横向模式下显示底部工作表对话框时 我遇到了错误的行为 该问题出现在24 版本的设计库中 根据下图 底页仅在横向模式下无法正确显示 我正在使用 BottomSheetDialog 类 并且正在遵循本教程 http www skholingu
  • Android 防火墙与 VpnService

    我正在尝试使用 BS 项目的 VpnService 为 Android 实现一个简单的防火墙 我选择 VpnService 因为它将在非 root 设备上运行 它将记录连接并让您过滤连接 基于IP 有一个应用程序可以做到这一点 因此这是可能
  • 大型 XML 的 XML 节点到字符串转换

    到目前为止我一直在使用DOM源在我的 Android 应用程序中将 XML 文件转换为字符串 这是我的代码 public String convertElementToString Node element throws Transform
  • Android:UiTesting 时运行时错误

    我正在尝试运行 Ui 测试 每次运行应用程序时 它都会在控制台中出现以下错误并关闭正在运行的应用程序 我导入了 uiautomator jar android jar 和 JUnit4 库 我正在使用 Eclipse 我在这里缺少什么 20
  • 使用 Lint 和 SonarQube 分析 Android 项目

    我真的 溢出 了试图让这些东西一起工作 我按照这里的指示进行操作 http docs sonarqube org display PLUG Android Lint Plugin http docs sonarqube org displa
  • Android facebook api,获取不同尺寸的头像

    我正在使用相对较新的 Facebook 图形 api 我正在获取使用该应用程序的朋友列表及其个人资料照片 我不知道如何修改我发送的参数 以便返回的图片很大 当前返回的默认值很小 我正在使用 newMyFriendsRequest 我发送的参
  • 无法在 Windows 7 上安装 Android USB 驱动程序

    所以我想使用我的新 Nexus 5 来调试我的应用程序 我尝试通过以下方式安装 Android USB 驱动程序装置经理 http developer android com tools extras oem usb html Win7但我
  • 如何更改区域设置以使用拉丁塞尔维亚语(而不是西里尔塞尔维亚语)

    塞尔维亚语有拉丁字母和西里尔字母 在 Android 的日期和时间选择器小部件中 显示的塞尔维亚语言区域字母似乎是西里尔字母 如此处所示 我想更改区域设置 以便 Android 小部件使用拉丁塞尔维亚字母 当前的语言 国家代码 产生西里尔字
  • 无法 HEAD 'https://jcenter.bintray.com/com/facebook/react/react-native/maven-metadata.xml'。从服务器收到状态代码 502:网关错误

    我正在尝试为 Android 构建我的 React Native 项目 并在 Windows 上收到以下错误 但它在 Mac 上工作 react native run android info Running jetifier to mig
  • 使用 Android 地图 v2 进行自由绘图

    我有一个地图应用程序 使用新的 v2 Google Maps API for Android 我想做的是允许用户在地图上沿着手指的路径画一条线 我知道我可能需要一个按钮来启用 禁用此功能 因为它显然需要禁用平移 缩放控件 一旦用户画了线 我
  • 如何替换 TabAdapter 中选项卡之一的片段?

    虽然我意识到嵌套片段不是一个选择 但我仍然有一个问题 我根本无法找出答案 我正在使用 ActionBarSherlock 的 FragmentsTabPager 示例创建一个界面 在该界面中可以通过滑动而不是单击选项卡来翻阅选项卡 我的问题
  • 如何获取 res.drawable 文件夹的路径来复制文件?

    我正在编写我的应用程序AndroidStudio 我的里面有gif文件drawable gifs文件夹 我希望将该文件复制到MediaStore Images Media单击按钮后的文件夹 目前 即使使用发布的一些答案 我也无法获取我的 g

随机推荐

  • Qt 读取多行文本框中的内容

    本文介绍将plainTextEdit中的多行文本内容按行读取为字符串的方法 QTextDocument doc ui gt plainTextEdit gt document 将plainTextEdit中的内容读取到doc中 int co
  • 【Kubernetes系列】Container(容器)

    文章目录 Container Container Image 容器镜像 镜像名称 更新镜像 镜像拉取策略 默认镜像拉取策略 强制拉去镜像 ImagePullBackOff 使用私有仓库 容器环境 容器信息 集群信息 Runtime Clas
  • pycharm如何安装pythoncard_pycharm的各种设置,配置

    本博客一直在同步更新中 内容包含 pycharm学习技巧 Learning tips PyCharm3 0默认快捷键 翻译的 pycharm常用设置 pycharm环境和路径配置 Pycharm实用拓展功能 pycharm中清除已编译 py
  • 有关数据结构上机实验的问题

    1 收到学弟提醒 http chuantu xyz t6 741 1605524547x 1566660945 png 本实验不允许公开实验代码 2 原专栏设置付费 本意是希望大家不要再看了 但是有同学订阅了 特此表示歉意 考虑不周 3 原
  • Python爬虫怎么挣钱?6个Python爬虫赚钱方式,搞搞副业不是问题

    1 最典型的就是找爬虫外包活儿 网络爬虫最通常的的挣钱方式通过外包网站 做中小规模的爬虫项目 向甲方提供数据抓取 数据结构化 数据清洗等服务 新入行的程序员大多都会先尝试这个方向 直接靠技术手段挣钱 这是我们技术人最擅长的方式 因项目竞价的
  • redis监控命令monitor(监控内容写入文件)

    redis有一个monitor命令 使用该命令可以实时监控redis正在执行的命令 先登录redis集群 redis app 3 2 12 bin redis cli h 192 168 177 122 p 6379 a abcdef c
  • USB数据线串联电阻知识总结

    一 为什么USB的特性阻抗为90欧姆 USB设备具有简单易用 支持热插拔 速度快等特点 很快被广泛应用于个人电脑和移动设备等信息通讯产品 并扩展至摄影器材 数字电视 机顶盒 游戏机等其它相关领域 可以说USB是目前最为成功的I O技术 而且
  • DDOS高防IP的用途

    DDOS高防IP是为了应对互联网的DDOS攻击而产生的一款付费增值产品 那么该怎么使用呢 DDOS高防IP根据不同的业务接入的方法也不同 在开通这款DDOS高防IP时服务商会给到对应的高防IP作为对外IP和业务IP使用 游戏业务就需要将之前
  • 带你看懂CTC算法

    转自 https zhuanlan zhihu com p 161186907 在文本识别模型CRNN中 涉及到了CTC算法的使用 由于算法的原理涉及内容较多 所以特另开一篇文章对其原理进行叙述 自己在学习CTC过程中也是看了诸多资料才大概
  • 【AI面试】损失函数(Loss),定义、考虑因素,和怎么来的

    神经网络学习的方式 就是不断的试错 知道了错误 然后沿着错误的反方向 梯度方向 不断的优化 就能够不断的缩小与真实世界的差异 此时 如何评价正确答案与错误答案 错误的有多么的离谱 就需要一个评价指标 这时候 损失和损失函数就运用而生 开始之
  • 终端软件MobaXterm新建会话与本地虚拟机连接失败原因分析:Network error: connection refused

    一 首先第一步 检查虚拟机与本机的连通性 在本机powershell终端执行ping 虚拟机ip 虚拟机ip的获取实在虚拟机中执行ifconfig 第一个四位数字就是ip地址 二 ping过之后 发现很正常 那就检查ssh ps e gre
  • Java中的基础----序列化与反序列化的作用

    Java提供两种对象持久化的方式 分别序列化和外部序列化 1 序列化 Serialization 在分布式环境下 无论是何种数据 都会以二进制序列的形式在网络上传输 序列化是一种将对象以一连串的字节描述的过程 用于解决在对对象流进行读写操作
  • Unicode 编码表下载

    概述 很多项目都使用了Unicode 编码表 在此 做个笔录 官网 1 第一入口 https home unicode org 2 第二入口 Unicode 14 0 Character Code Charts 3 第三入口 http ww
  • 如何获得ISO测试版软件,苹果发布iOS11.4 beta2公测版 如何申请iOS11公测资格

    在对应开发者版本推送一天之后 苹果今天凌晨又向公测用户推送了 iOS 11 4 和 tvOS 11 4 的第二个测试版系统更新 iOS 11 4 的 beta 版系统主要用来测试隔空播放 2 以及 iCloud 信息等新功能 tvOS 11
  • 流畅交互体验:实现Vue中el-dialog拖动效果的完美指南

    在使用elementUI中的Dialog组件时 总有无理的产品提需求 在右上角增加可点击全屏的功能 给我实现弹出框可任意拖拽的功能 这种情况下 组件就不能很好的使用了 那么 只能由我们前端攻城狮进行代码攻克了 接下来就实现其中的可拖拽功能
  • UnicodeDecodeError: 'gbk' codec can't decode byte 0x80 in position 2: illegal multibyte sequence

    最近在搞人工智能的东东 玩了玩词云的东西 在编写代码时 出现了一个问题 目的 统计西游记里出现的词的内容 读取西游记整本小说的内容 然后进行统计分析 代码如下 text open 西游记 txt read 但是在执行的时候一直报错 Unic
  • 方舟生存进化秘籍大全

    代码大全 addexperience 10000 0 0 1 给角色加1W经验 可以修改数值 修改人物每升级一次 各种属性的增长倍率 修改文件 common ARK ShooterGame Saved Config WindowsNoEdi
  • adb刷入第三方recovery_【玩机必会技能】小米手机通用刷TWRP RECOVERY

    点击上方 蓝字 关注我们 想让自己的手机获取更多的功能和体验不同的安卓系统 掌握下面这些是必不可少的 此教程也适用于其他品牌的安卓手机 步骤都是一样的 刷入TWRP RECOVERY 这是手机刷入ROOT和第三方ROM的必备工具 而解Boo
  • hualinux2.21 环境搭建:Centos8安装 LVS+keepalived高可用负载均衡

    在前面讲了 hualinux2 19 环境搭建 Centos8 nginx负载均衡 反代 和 hualinux2 20 环境搭建 centos8源安装haproxy 两个常用的负载均衡 基本上都是推荐做七层负载 虽然也有四层负载的能力 现在
  • ViewPager2一页展示多个Item且两边滑动

    ViewPager2一页展示多个Item且两边滑动 研究背景 在项目中有一个滚轮选择器的需求 对于小组件的研发 我一直倾向于自研 一方面功能不复杂 另一方面也锻炼自己的思维能力 不只是局限于上次研发 传统Viewpager解决方法 对于传统