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

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

  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.hqwc.cn/news/174792.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

深圳联强优创手持PDA身份证阅读器 身份证核验手持机

身份证手持机外观比较小巧&#xff0c;方便携带&#xff0c;支持条码识别、人脸识别、NFC卡刷卡、内置二代证加密模块&#xff0c;可离线采集和识别二代身份证&#xff0c;进行身份识别。信息读取更便捷、安全高效。采用IP65高防护等级&#xff0c;1.5M防摔&#xff0c;可以适应…

【云备份项目两万字总结】服务端篇 -----附源码

项目总结 整体回顾逐步实现utill.hppconfig.hppdata.hpphot.hppservice.hpp 代码 整体回顾 服务端的目标是&#xff1a; 对客户端的请求进行处理管理客户端上传的文件 于客户端进行数据交换&#xff0c;我们需要引入网络&#xff0c;所以我们引入第三方库----httplib.h库&am…

【Python图像超分】Real-ESRGAN图像超分模型(超分辨率重建)详细安装和使用教程

1 前言 图像超分是一种图像处理技术&#xff0c;旨在提高图像的分辨率&#xff0c;使其具有更高的清晰度和细节。这一技术通常用于图像重建、图像恢复、图像增强等领域&#xff0c;可以帮助我们更好地理解和利用图像信息。图像超分技术可以通过多种方法实现&#xff0c;包括插值…

【Docker】Docker 网络

引言 Docker是一个开源的应用容器引擎&#xff0c;它允许开发者将应用及其依赖打包到一个可移植的容器中&#xff0c;然后发布到任何流行的Linux机器或Windows机器上&#xff0c;也可以实现虚拟化。Docker的主要优势之一是其网络功能&#xff0c;而网络功能的核心就是网络驱动…

自定义Matplotlib中的颜色映射(cmap)

要自定义Matplotlib中的颜色映射&#xff08;cmap&#xff09;&#xff0c;您可以按照以下步骤进行操作&#xff1a; 导入所需的库&#xff1a; import numpy as np import matplotlib.pyplot as plt from matplotlib.colors import LinearSegmentedColormap创建自定义颜色映…

Docker修改容器内部文件的三种方法

为啥要记录呀 今天在修改Docker内部文件的时候&#xff0c;安装vim居然失败了&#xff0c;在执行apt-get update时一直有几个404&#xff0c;解决无果&#xff0c;最后放弃安装vim&#xff0c;将文件拷贝出来修改&#xff0c;然后再拷贝到docker内部。记录一下如何修改Docker内…

软件工程分析报告06测试结果分析报告——基于Paddle的肝脏CT影像分割

测试结果分析报告 一、测试方法 本次测试涵盖了白盒测试和黑盒测试的相关技术。在白盒测试方面&#xff0c;采用了语句覆盖、判定覆盖、条件覆盖、判定/条件覆盖、条件组合覆盖、路径覆盖、点覆盖和边覆盖等方法。在黑盒测试方面&#xff0c;采用了等价类划分、边界值分析、因…

jetson配置笔记

typora-root-url: /home/msj/ubuntu笔记本台式机环境配置说明/images Ubuntu18.04 配置 说明&#xff1a;我们所有文档配置都是按照ubuntu18.04&#xff0c;保证x86架构(笔记本台式机)和 ARM架构(jetson Nano只能安装18.04)的一致性 1. 更换各类源 我们所有源都更换清华源&a…

用二维码展示产品,随时查看图文并茂的介绍

传统的产品宣传方式&#xff0c;往往以产品手册、宣传单等纸质物料为主&#xff0c;不仅会造成客户获取和携带上的不便&#xff0c;一旦内容需要更新&#xff0c;就必须重新印刷&#xff0c;造成不必要的浪费&#xff0c;而且老用户看到的仍然是旧内容。 其实可以用二维码进行…

vuejs - - - - - 移动端设备兼容(pxtorem)

pxtorem的使用 1. 依赖安装2. vue.config.js配置3. 动态设置html的font-size大小4. 效果如图&#xff1a; 1. 依赖安装 yarn add postcss-pxtorem -D 2. vue.config.js配置 module.exports {...css: {loaderOptions: {postcss: {plugins: [require("postcss-pxtorem&quo…

吊打Fast Request还免费? 这款插件真心好用!

今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;比Fast Request更好用并且完全免费&#xff01;三大亮点功能&#xff1a;写完代码IDEA内一键生成API文档&#xff1b;写完代码IDEA内一键调试&#xff0c;&#xff1b;生成API目录树&#xff0c;双击即可快速…

【debug】解决Kali虚拟机开机黑屏,左上角光标一直闪动无法开机问题

做网络攻防实验时&#xff0c;突然Kali无法打开&#xff0c;遇到这个问题。。。。。。 遇到的问题 突然kali虚拟机变成如下黑屏&#xff0c;无法开机&#xff0c;左上角光标闪动&#xff0c;重启无效。 解决办法 在上图界面&#xff0c;按Ctrl F3&#xff08;不同电脑快捷键…