【Android】画面卡顿优化列表流畅度三之RecyclerView刷新机制notifyItemRangeInserted

news2025/1/11 18:44:06

经过长达一个多星期的反复渲染耗时记录,大致上有以下几个方面的地方可以优化:

  1. 列表组件RecyclerView刷新机制由notifyDataSetChanged()优化为notifyItemRangeInserted(),后期有必要也会使用notifyItemRangeRemoved、notifyItemRangeChanged、notifyItemMoved等等方式更新刷新数据
  2. Glide图片加载库优化参数设置:缩略图thumbnail(0~1.0f)、RequestOptions里sizeMultiplier、override、dontAnimate、noTransformation()等
  3. 内存优化设置clearMemory()
  4. 磁盘清理设置clearDiskCache()
  5. RefreshLayout下拉刷新上拉加载更多组件;因为布局嵌套等原因这个组件和NestedScrollView不兼容;另外这个组件里的上拉加载更多的逻辑居然是有bug的,而且是对画面顿感很致命的逻辑漏洞。查了好久才发现的。吐血一升表示无语中
  6. 分页加载由于历史原因并不能统一返回10条,而是有可能大于20条这样的情况存在,再吐一升;非常无语,本来图片就够重了,现在发现某些页数据数量也很重。

先介绍RecyclerView刷新机制notifyItemRangeInserted()

大致用法如下:

// 在RecyclerView的适配器中,使用notifyItemRangeInserted通知数据插入
// positionStart为插入操作的起始位置
// itemCount为插入的数据项数量
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    // ... 其他代码

    // 在适配器中定义数据集合
    private List<String> mData;

    // ... 其他代码

    // 在适配器中定义方法用于插入新的数据项
    public void insertData(List<String> newData, int positionStart) {
        mData.addAll(positionStart, newData); // 在指定位置插入新数据
        notifyItemRangeInserted(positionStart, newData.size()); // 通知适配器数据插入
    }

    // ... 其他代码
}

这个方法亲测过,对于数据量比较大的情况优化效果比较明显,至少对笔者的场景很有用,这个方法使用后避免了上下滑动的过程中出现的卡顿严重的情况,目前还有个大问题就是新加载一页数据渲染问题。后面再说,下面介绍几个刷新机制的用法:

notifyItemRangeRemoved

// 在RecyclerView的适配器中,使用notifyItemRangeRemoved通知数据移除
// positionStart为移除操作的起始位置
// itemCount为移除的数据项数量
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    // ... 其他代码

    // 在适配器中定义数据集合
    private List<String> mData;

    // ... 其他代码

    // 在适配器中定义方法用于移除数据项
    public void removeData(int positionStart, int itemCount) {
        mData.subList(positionStart, positionStart + itemCount).clear(); // 移除指定位置范围内的数据
        notifyItemRangeRemoved(positionStart, itemCount); // 通知适配器数据移除
    }

    // ... 其他代码
}

notifyItemRangeChanged

// 在RecyclerView的适配器中,使用notifyItemRangeChanged通知数据变化
// positionStart为变化操作的起始位置
// itemCount为变化的数据项数量
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    // ... 其他代码

    // 在适配器中定义数据集合
    private List<String> mData;

    // ... 其他代码

    // 在适配器中定义方法用于修改数据项
    public void changeData(List<String> newData, int positionStart) {
        for (int i = 0; i < newData.size(); i++) {
            mData.set(positionStart + i, newData.get(i)); // 修改指定位置范围内的数据
        }
        notifyItemRangeChanged(positionStart, newData.size()); // 通知适配器数据变化
    }

    // ... 其他代码
}

notifyItemMoved

// 在RecyclerView的适配器中,使用notifyItemMoved通知数据项移动
// fromPosition为数据项移动前的位置
// toPosition为数据项移动后的位置
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
    // ... 其他代码

    // 在适配器中定义数据集合
    private List<String> mData;

    // ... 其他代码

    // 在适配器中定义方法用于移动数据项
    public void moveData(int fromPosition, int toPosition) {
        String item = mData.remove(fromPosition); // 移除原位置的数据项
        mData.add(toPosition, item); // 将数据项插入到新位置
        notifyItemMoved(fromPosition, toPosition); // 通知适配器数据项移动
    }

    // ... 其他代码
}

后面几个没有亲测过,可能具体用法有所区别,这里只是记录一下方便备用

smartApi接口开发工具推荐

历时一年半多开发终于smartApi-v1.0.0版本在2023-09-15晚十点正式上线
smartApi是一款对标国外的postman的api调试开发工具,由于开发人力就作者一个所以人力有限,因此v1.0.0版本功能进行精简,大功能项有:

  • api参数填写
  • api请求响应数据展示
  • PDF形式的分享文档
  • Mock本地化解决方案
  • api列表数据本地化处理
  • 再加上UI方面的打磨

下面是一段smartApi使用介绍:
在这里插入图片描述

下载地址:

https://pan.baidu.com/s/1kFAGbsFIk3dDR64NwM5y2A?pwd=csdn

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

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

相关文章

node插件MongoDB(四)—— 库mongoose 的条件控制(三)

文章目录 前言一、运算符二、逻辑运算1. $or 逻辑或2. $and 逻辑与 三、正则匹配 前言 在mongodb 不能使用 > < > < ! 等运算符&#xff0c;需要使用替代符号。 一、运算符 > 使用 $gt< 使用 $lt> 使用 $gte< 使用 $lte! 使用 $ne 例子&#xff1a;获…

高性能网络编程 - 解读3种线程模型

文章目录 Pre线程模型1&#xff1a;传统阻塞 I/O 服务模型线程模型2&#xff1a;Reactor 模式Reactor 模式的基本设计思想Reactor 模式中的关键组成3种典型实现单 Reactor 单线程单 Reactor 多线程主从 Reactor 多线程 小结 线程模型3&#xff1a;Proactor 模型 Pre 高性能网络…

git命令之遭遇 ignore罕见问题解决

我先来讲讲背景 我的一些文件在ignore了&#xff0c;不会被提交到远程仓库&#xff0c;这时候我的远程仓库中是没有这几个文件的&#xff0c;这时候我如果使用 git reset 的话这时候除了那几个 ignore 的文件以外都被更新的&#xff0c;但是如果我不需要这几个被 ignore 的文件…

【操作系统】2011年408真题第 31 题

文章目录 题目描述解析单缓冲区双缓冲区 原题 & 解析 题目描述 31.某文件占10个磁盘块&#xff0c;现要把该文件磁盘块逐个读入主存缓冲区&#xff0c;并送用户区进行分析&#xff0c;假设一个缓冲区与一个磁盘块大小相同&#xff0c;把一个磁盘块读入缓冲区的时间为100μ…

MySQL | 数据库的表的增删改查【进阶】

MySQL | 数据库的表的增删改查【进阶】 文章目录 MySQL | 数据库的表的增删改查【进阶】系列文章目录本节目标&#xff1a;数据库约束约束类型NULL约束UNIQUE&#xff1a;唯一约束DEFAULT&#xff1a;默认值PRIMARY KEY&#xff1a;主键FOREIGN KEY&#xff1a;外键CHECK 表的设…

Wincc flexible SMART v4 报警蜂鸣器的基本使用方法示例

Wincc flexible SMART v4 报警蜂鸣器的基本使用方法示例 WinCC flexible SMART V4 SP1 软件针对SMART LINE V4 面板新增了触发蜂鸣器报警功能,但要注意该功能仅支持固件版本为 4.0.1.0 及以上的设备。 可通过配置以下两个系统函数来触发蜂鸣器: 举例说明: 组态离散量报警,在…

Leetcode刷题详解——全排列 II

1. 题目链接&#xff1a;47. 全排列 II 2. 题目描述&#xff1a; 给定一个可包含重复数字的序列 nums &#xff0c;按任意顺序 返回所有不重复的全排列。 示例 1&#xff1a; 输入&#xff1a;nums [1,1,2] 输出&#xff1a; [[1,1,2],[1,2,1],[2,1,1]]示例 2&#xff1a; 输…

Linux——进度条小程序|行缓冲区概念|使用 git 命令行

目录 1./r 和 /n 2.行缓冲区概念 3.使用 git 命令行 安装git 克隆到本地仓库 添加文件到仓库 提交到本地仓库 提交到远端仓库 1./r 和 /n 对于 /n 想必都不陌生&#xff0c;是换行的意思 而 /r 就是回车的意思 &#xff0c;回到一行的开始 在C/C中 \n通常都代表 回车…

Adobe ME下载、Media Encoder下载

Media Encoder 2021 是一款可以帮助Adobepremiere pro和Adobe After Effects的用户使用集成视频编码器进行创作的视频和音频编码软件。Media Encoder 2021 mac新版本中针对上一个版本进行了多方面的改进与优化&#xff0c;提升了软件的性能与支持文件格式提升&#xff0c;有需要…

物业管理服务预约小程序的效果如何

物业所涵盖的场景比较多&#xff0c;如小区住宅、办公楼、医院、度假区等&#xff0c;而所涵盖的业务也非常广&#xff0c;而在实际管理中&#xff0c;无论对外还是对内也存在一定难题&#xff1a; 1、品牌展示难、内部管理难 物业需求度比较广&#xff0c;设置跨区域也可以&…

数据库数据恢复—MSSQL报错“附加数据库错误823”如何恢复数据?

数据库故障&分析&#xff1a; MSSQL Server数据库比较常见的报错是“附加数据库错误823”。如果数据库有备份&#xff0c;只需要还原备份即可&#xff1b;如果无备份或者备份不可用&#xff0c;则需要使用专业的数据恢复手段去恢复数据。 MSSQL Server数据库出现“823”的报…

Java语言基础(下)

toString() 、String.valueof()、(String)&#xff1f; toString()&#xff1a;Object 类的方法&#xff0c;可以将一个对象转换为字符串类型String.valueOf()&#xff1a;可以将一个对象或基本数据类型转换为字符串类型 如果参数是对象&#xff0c;则调用 toString() 方法&am…

sql注入:延时注入python万能脚本

sql注入:延时注入python脚本 import requests import binascii def judgment_delay(complete_url):headers{"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36"}try:requ…

Zynq-Linux移植学习笔记之65- 国产ZYNQ在linux下usleep时间精度不准问题解决

1、背景介绍 采用复旦微的ZYNQ&#xff0c;跑linux操作系统&#xff0c;在应用程序中使用usleep进行延时时&#xff0c;发现存在10ms以下采用usleep试验都为10ms的情况 2、解决办法 使能设备树中的PS TTC设备&#xff0c;默认不是打开的 timere0024000 {compatible "s…

rangenet++运行 bonnetal训练 点云标签 记录

准备原始点云数据&#xff0c;为bin格式 安装point_labeler工具&#xff0c;根据readme步骤安装&#xff0c;并设定好格式进行标签 修改bonnetal的配准 安装semantic-kitti&#xff0c;查看点云标签content&#xff0c;并修改bonnetal上的设置 ./content.py --dataset ~/da…

AI 编程工具带来了什么

注册 地址为 https://web.devchat.ai/signup/ AI 编程工具带来了什么 深度学习框架&#xff1a; 用于实现神经网络和深度学习模型的框架&#xff0c;如TensorFlow、PyTorch、Keras等。这些工具提供了高级的API和工具&#xff0c;使得实现和训练神经网络变得相对容易。 自然语…

基础代码介绍

#include<pic.h> //包含单片机内部资源字义 __CONFIG(0xFF32); //4M __CONFIG(0XFF32)void main() {TRISD0;//D口输出PORTD0b00000001;//第一个LED灯点亮&#xff0c;高电平1while(1);// } /* void main() { TRISD0; PORTD0x01 while(1); }*/ 点亮一颗LEDD灯&#xff1a…

OpenText Exceed TurboX (ETX) —— 对图形密集型应用程序进行高性能远程访问

OpenText Exceed TurboX (ETX) —— 对图形密集型应用程序进行高性能远程访问 OpenText Exceed TurboX使团队(无论位于何处)能够对图形密集型应用程序进行高性能远程访问&#xff0c;提高生产力并减少 IT 支出&#xff0c;以确保快速投资回报。 亮点&#xff1a; 降低IT支出…

【python高级】asyncio 并发编程

【大家好&#xff0c;我是爱干饭的猿&#xff0c;本文重点介绍python高级篇的事件循环&#xff0c;task取消和协程嵌套、call_soon、call_later、call_at、 call_soon_threadsafe、asyncio模拟http请求、asyncio同步和通信、aiohttp实现高并发实践。 后续会继续分享其他重要知…

完整版付费进群带定位源码

看到别人发那些不是挂羊头卖狗肉&#xff0c;要么就是发的缺少文件引流的。恶心的一P 这源码是我付费花钱买的分享给大家&#xff0c;功能完整。 搭建教程 nginx1.2 php5.6--7.2均可 最好是7.2 第一步上传文件程序到网站根目录解压 第二步导入数据库&#xff08;shujuk…