Android Viewpager2 remove fragmen不生效解决方案

一、介绍

在如今的开发过程只,内容变化已多单一的fragment,变成连续的,特别是以短视频或者直播为主的场景很多。从早起的Viewpage只能横向滑动,到如今的viewpage2可以支持横向或者竖向滑动。由于viewpage2的adapter在设计时支持缓存,导致想立马生效出现问题,不符合国内的业务场景。

二、viewpage2+FragmentStateAdapter设计原理分析

1.Viewpager2

Viewpaer2的设计和viewpage还是有区别的,最大的区别是viewpage是基础viewgroup,通过scroll控制整体view的滑动,在早起的时候,很多都是可以通过adapter去自定义缓存,但是viewpage2在androidx中新增的,是通过对recycleview进行二次封装出来的一个新业务。

从源码中可以看出,核心是recycleview,这个控件在之前v7包中是独立出来的,相对listview性能更好,在缓存和使用更流畅,也是支持横向或者竖向滑动。

2.FragmentStateAdapter

adpter的与Recycview.adapter还是有区别的。核心是adapter和holder。

2.1FragmentStateAdapter

继承recycView.adapter,里面对item进行了缓存,mFragments是一个key和fragment绑定的关系,下表就是fragment的索引。如果不经常对fragment移除,那么这个缓存可以大大提高性能。但是也就是这个原因,导致在设计的时候没考虑到移除立马生效等问题

2.2FragmentViewHolder

继承了RecycleView.holder,只要是在holder阶段,创建一个rootview->FragmentLayout将fragment包进来。提供容器

三、删除无法立即更新分析

通过第二段,了解了viewpage2+FragmentStateAdapter的设计,可以了解到这些设计的目的。但是我们在开发过程中的场景比较复杂,有人习惯了recycleView+recycleView.Adapter,以为viewpage2的核心也是这套,删除数据或者更新数据直接通过notify去处理,结果发现viewpage2移除不是我们要的那个索引,这是为什么呢?

1.问题分析:

这个问题和fragmentStateAdapter设计有关,在这个adapter中,mfragment的缓存是通过下表缓存的,也就是我们虽然把数据移除了,但是position在adapter的索引是连续的,还是从0开始,一直到最后一个元素,就算我们通知了notifyItemRemoved(position),但是数据移除了,下标也发生了变化,这时候我们通知移除的变成了当前位置后一个:position+1,和我们理想中还是有比较大的区别

这种做法和recycleView.Adapter内部不一样,很多开发人员遇到确实无法处理,想着从数据来处理,这种方法是行不通的。

四、解决方案

目前暴露的api还是很不好处理,网上的方案也是五花八门

1.重置adapter:

        这种做法是删除数据,把viewpage2的adapter设为null,再用数据重新生成一个新的,这样做的弊端是影响了性能和体验

2.直接notify刷新:

        发现下标索引乱了,数据移除失败

处理这个问题的核心是要把mfragment数组中的要对应的数据下表给移除,然后重新排序。只有保持索引下表和mfragment中的fragment对应,才能取到我们想要的view。

在adapter中也提供了一个remove的方法:removeFragment(position:Int),但是这个方法是私有的,我们只能通过反射来获取这个方法

步骤:

1.先将数据中索引下的数据移除

2.在移除removeFragment,最后在notifyItemRemoved刷新列表,保持索引的真实性

        public fun remove(position: Int) {
            //先移除item在父类中的adapter
            adapter?.apply {
                val cls = this.javaClass
                val method = cls.superclass.getDeclaredMethod("removeFragment", Long::class.java)
                method.isAccessible = true
                method.invoke(this, position)
            }
            if (position == viewPager!!.currentItem) {
                viewPager?.setCurrentItem(position, false)
            }

            mlsit.removeAt(position)
            notifyItemRemoved(position)
        }

只有通过这样,才能保持下标与数据所在数组的准确性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

预告 | 博睿数据将亮相第四届中国新能源汽车产业数智峰会

随着数字化、智能化浪潮的汹涌而至,全球汽车产业正站在一个崭新的历史起点上。新能源汽车,作为这场科技革命和产业变革的领跑者,其数智化发展正呈现出前所未有的蓬勃态势。正是在这样的背景下,第四届中国新能源汽车产业数智峰会将…

Windows 虚拟机服务器项目部署

目录 一、部署JDK下载JDK安装JDK1.双击 jdk.exe 安装程序2.点击【下一步】3.默认安装位置,点击【下一步】4.等待提取安装程序5.默认安装位置,点击【下一步】6.等待安装7.安装成功,点击【关闭】 二、部署TomcatTomcat主要特点包括:…

【线程安全】关于死锁问题

文章目录 死锁的基本概念死锁的四个必要条件避免死锁避免死锁的算法死锁检测算法 死锁的基本概念 死锁是指在一组进程中的各个进程均占有不会释放的资源,但因互相申请被其他进程所站用不会释放的资源而处于的一种永久等待状态。当然,线程之间同样也有死…

【产品经理】WMS多仓调拨转移说明

对于仓储管理来说,越来越多企业开始应用WMS进行系统化的管理,以提升仓库的作业效率。本文作者从业务流程和基础功能两个方面展开介绍,希望对你有帮助。 一、业务流程 。在线下业务流程拓展,仓库不断增多的过程中,由于…

docker私有仓库harbor安装

Harbor默认安装 下载harbor https://github.com/goharbor/harbor/releases/download/v2.11.0/harbor-offline-installer-v2.11.0.tgz 目前要求docker版本,docker 20.10.10-ce ,和docker-compose 1.18.0 查看 docker-compose版本 docker-compose --ver…

【Python】Python模块及常用模块介绍

个人主页:【😊个人主页】 系列专栏:【❤️Python】 文章目录 前言Python 模块(Module)模块的作用模块的创建模块的引入import 语句from…import 语句from…import* 语句 搜索路径常用模块[Python 标准库](https://docs.python.org/zh-cn/3/li…

Android中RecyclerView使用详解(一)

目录 概述优点列表布局RecyclerView一、创建RecyclerView并且在布局中绑定二、实现RecyclerView单个item的布局三、给RecyclerView写一个对应的适配器Adapter1.创建自定义的ViewHolder2.继承Adapter,泛型使用我们自定义的ViewHolder3.重写Adapter的三个方法onCreate…

STM32基础篇:EXTI × 事件 × EXTI标准库

EXTI EXTI简介 EXTI:译作外部中断/事件控制器,STM32的众多片上外设之一,能够检测外部输入信号的边沿变化并由此产生中断。 例如,在检测按键时,按键按下时会使电平产生翻转,因此可以使用EXTI来读取按下时…

Kotlin Misk Web框架

Kotlin Misk Web框架 1 Misk 框架介绍2 Misk/SpringBoot 框架对比3 Misk 添加依赖/配置3.1 build.gradle.kts3.2 settings.gradle.kts3.3 gradle.properties 4 Misk 请求接口5 Misk 程序模块6 Misk 主服务类7 Misk 测试结果 1 Misk 框架介绍 Misk 是由 Square 公司开发的一个开…

Python:while循环

while循环体 while 条件: 符合条件执行语句 .... 执行完后需执行的语句 # while循环 i1 while i<5:print(i)ii1 print("Done") test. 做一颗圣诞树吧 答案&#xff1a; # while循环 i 1 j5 while i < 5:print( * j* * i)i i 2jj-1 print("Done"…

【Python百日进阶-Web开发-音频】Day702 - librosa安装及模块一览表

文章目录 一、Librosa简介与安装1.1 Librosa是什么1.2 Librosa官网 二、Librosa安装2.1 安装Librosa 三、安装ffmpeg3.1 ffmpeg官网下载3.2 ffmpeg安装3.2.1 解压3.2.2 添加环境变量3.2.3 测试ffmpeg是否安装成功 四、Librosa 库模块一览4.1 库函数结构4.2 Audio processing&am…

Redis-linux下安装redis7配置

Redis安装配置 Redis安装配置一、Linux环境安装Redis必须先具备gcc编译环境1.什么是gcc 二、版本选择三、Redis7安装步骤1.下载2./opt目录下解压redis3.执行make命令4.查看默认安装目录:usr/local/bin5.初始化设置redis.conf6.启动服务7.连接服务8.关闭服务9.卸载redis Redis安…

方便好用的C#.Net万能工具库Masuit.Tools

文章目录 简介开发环境安装使用特色功能示例代码1. 检验字符串是否是Email、手机号、URL、IP地址、身份证号等2.硬件监测(需要管理员权限&#xff0c;仅支持Windows&#xff0c;部分函数仅支持物理机模式)3.html的防XSS处理&#xff1a;4.整理Windows系统的内存&#xff1a;5.任…

施耐德EOCR系列电机保护器全面升级后無端子型

一、施耐德数码型产品升级背景 施耐德电气作为一家全球领先的能源管理和自动化解决方案提供商&#xff0c;其产品线包括各种电动机保护器等数码型产品。随着技术的不断发展和市场需求的变化&#xff0c;施耐德会对其产品进行定期升级和优化。在升级过程中&#xff0c;产品的设…

前后端通信 —— HTTP/HTTPS

目录 一、HTTP/HTTPS 简介 1、HTTP 2、HTTPS 二、HTTP 工作过程 三、HTTP 消息 1、HTTP消息结构 2、HTTP消息示例 四、HTTP 方法&#xff08;常用&#xff09; 1、GET 2、POST 3、PUT 4、DELETE 5、GET与POST对比 五、HTTP 状态码&#xff08;常用&#xff09; …

Linux多线程编程-生产者与消费者模型详解与实现(C语言)

1.什么是生成者与消费者模型 生产者-消费者模型是并发编程中的经典问题&#xff0c;描述了多个线程&#xff08;或进程&#xff09;如何安全、有效地共享有限的缓冲区资源。在这个模型中&#xff0c;有两种角色&#xff1a; 生产者&#xff08;Producer&#xff09;&#xff1…

牛客周赛 Round 51 解题报告 | 珂学家

前言 题解 典题场&#xff0c; EF都有很多种解法 A. 小红的同余 性质: 相邻两数互质 x ( m 1 ) / 2 x (m1)/2 x(m1)/2 m int(input())print ((m 1) // 2)B. 小红的三倍数 性质: 各个位数之和是3的倍数&#xff0c;可被3整除 和数的组合顺序无关 n int(input()) arr…

Mysql数据表的约束(下)

3.默认值约束(default) 与非空约束的命令一致,因为都属于列级约束,因此只需将not null改为default 默认值即可 删除默认值约束: 4.主键约束(primary key) 表示给一张表格设置了一个唯一标识,为了更快的去通过唯一的数据去准确的查找到每一条记录,一半咱们在创建表…

Netgear WN604 downloadFile.php 信息泄露漏洞复现(CVE-2024-6646)

0x01 产品简介 NETGEAR WN604是一款由NETGEAR(网件)公司生产的无线接入器(或无线路由器)提供Wi-Fi保护协议(WPA2-PSK, WPA-PSK),以及有线等效加密(WEP)64位、128位和152位支持,保障网络安全。同时支持MAC地址认证、802.1x RADIUS以及EAP TLS、TTLS、PEAP等安全机制,…

昇思25天学习打卡营第15天|基于MobileNetv2的垃圾分类

一、关于MobileNetv2 MobileNet网络专注于移动端、嵌入式或IoT设备的轻量级CNN网络。MobileNet网络使用深度可分离卷积&#xff08;Depthwise Separable Convolution&#xff09;的思想在准确率小幅度降低的前提下&#xff0c;大大减小了模型参数与运算量。并引入宽度系数 α和…