解决ListView 缓存机制带来的显示不正常问题

Android ListView滑动过程中控件显示重复/错误问题之原理分析及解决方案 分析并解决①控件数据未初始化而导致的显示错误②网络异步加载导致出现显示错误、重复。 阅读详情

ListView加载数据原理:系统绘制ListView时,首先会用getCount()函数得到要绘制的这个列表的长度,然后开始逐行绘制。然后调用getView()函数,在这个函数里面首先获得一个View(简单item,如字符串或者单个组件的显示则是View,自定义的item,包含很多控件的时候是一个ViewGroup),然后再实例化并设置各个组件及其数据内容并显示它。如果我们有大量的item要显示怎么办?不可能为每个Item创建一个新的View,这会消耗大量的内存,可能会OOM!解决办法就是缓存View然后重复利用。这个图是解释了系统缓存的过程,当有前面的Item已经划出屏幕时,它的View将被后面的Item复用。https://i-blog.csdnimg.cn/blog_migrate/3ba554dbd3640af0496367014d74aead.jpeg

显示不正常问题:缓存机制固然很好,但在使用时要特别注意。比如,前面的Item里面的组件的数据也会被带到将要复用的Item中,从而导致显示错误。

 

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		Holder holder = null;
		convertView = null; //禁用缓存机制
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.bus_unit, parent, false);
			holder = new Holder();

			holder.station = (TextView) convertView
					.findViewById(R.id.textView_station);

 

 

 

 

 

解决办法:最简单的方法就是禁用它的缓存机制,这只适用于Item比较少的情况。

对于Item比较多的情况,这样的解决办法显然是不合适的。另外一种解决办法其实也挺简单的,只要将Item中的组件数据再初始化为原来的状态就行了。

 

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		// TODO Auto-generated method stub
		Holder holder = null;
		if (convertView == null) {
			convertView = mInflater.inflate(R.layout.bus_unit, parent, false);
			holder = new Holder();

			holder.station = (TextView) convertView
					.findViewById(R.id.textView_station);
			holder.stationState = (ImageView) convertView
					.findViewById(R.id.imageView_station_state);
			convertView.setTag(holder);
		} else {
			holder = (Holder) convertView.getTag();
		}
		//应对缓存机制,初始化数据。
		holder.stationState.setImageResource(R.drawable.presence_offline);
		holder.station.setText(bean.getBusList().get(position));
		
		if (bean.getBusList().get(position).equals(bean.getCurrentPosition())) {
			String text = bean.isDirection() ? "当前位置" : "目标位置";
			holder.stationState.setImageResource(R.drawable.presence_now);
		}
		
			String station;
			int index2 = bean.getBusList().get(position).indexOf("(");
			if (index2 != -1) {
				station = bean.getBusList().get(position).substring(0, index2);
			} else {
				station = bean.getBusList().get(position);
			}
			if (bean.getStationList().contains(station)) {
				if (bean.getStateList().get(index).equals("前往")) {
				holder.stationState.setImageResource(R.drawable.presence_online);
			}
		}
		return convertView;
	}

	

 

 

fast-lio运行步骤(使用velodyne数据) 使用fast-lio运行velodyne数据 阅读详情

相关推荐

03.Linux下目录动态扩容,以分配home的部分空间给root为例

本篇文章将介绍Linux下分配home目录的部分空间给root目录。大致思路:卸载home,解除其磁盘容量占用->扩容root,增加其磁盘空间->重建恢复home操作演示环境为CentOS系统,其他操作系统例如openEuler也可作为参考。01.Linux下目录扩容,以增加root目录的磁盘容量分配为例操作系统版本如下名称版本CentOS7.6+

ChennyWJS的博客 2337

关于ListView之关于缓存的一些看法

假如你的项目中出现了,在上下滑动时。有一些控件在不停的变化,那么我可以告诉你这是因为缓存所引起的. 那么ListView的缓存是什么? 在我看来这是一个很棒的效果,就跟整个Android系统一样,当你Android手机的内存在消耗的时候并不一定代表手机的运行速度会变慢。这是因为Android自带的缓存,这样可以保证这个app在被重新打开的时候,界面可以立马去恢复。不至于每次进入app的时候还要

qq_34277487的博客 425

TWINCAT3保姆级教程:手把手教你给Ecat从站烧录EEPROM(含XML配置避坑指南)

本文提供TWINCAT3环境下Ecat从站EEPROM烧录的完整教程,涵盖XML配置避坑指南。详细讲解环境准备、设备扫描、XML文件配置、EEPROM烧录流程及故障排查,帮助工程师高效解决设备识别问题,提升产线调试效率。

weixin_30693683的博客 516

recyclerview缓存机制导致的布局错乱问题

recyclerview和listview都是比较熟悉的玩意,我一直用的recyclerview比较多,当然如果我想偷懒的话我就会写个listview解决。如果你有一个这样的需求你想做一个和饿了么一样的购物界面,每个商品都会有加减数量,然后你是这样写的,你布局里面放置一个recyclerview,然后再写一个子布局,再写一个适配器,然后载入数据,ok你写完了。这样写当然不会有错误,你的逻辑也是正确的,但是当你运行的时候你会发现,当你在第一个商品选择好购买数量以后,你往下滑动大概九个的样子,然后再回到第一个你

weixin_41078100的博客 1031

UOS的ARM机编译QT5.14.2记录

我需要的qt版本是Qt5.14.2,所以选择编译Qt5.14.2源码;几个月前尝试了编译一次,当时编译过程中出现了报错,当时时间很紧最后安装的默认版本来使用,最近有时间重新进行了一次编译,历经3个星期(4G的内存)终于解决了各种坑,编译成功了,现在将编译过程中遇见的一些坑记录一下,方便日后能记得这一次可恶的编译过程,如有描述欠缺的地方,还希望各位大佬给点意见指导指导🙏。

NiF693zzz的博客 1618

针对so层不固定位置的动态加密,怎么解决?(面试题)

Android逆向之破解某应用加密算法(动态调试so和hook so代码):so 代码动态解密后才执行,我们可以在解密完成后获取解密后的代码或数据。Android逆向之旅—动态方式破解apk进阶篇(IDA调试so源码)如果你有更具体的加密场景,欢迎提供更多信息,我可以给出更详细的方案!某些 so 在运行时生成密钥,解密后再用。某APP密码加密算法分析。

SXXYNHHXX的博客 925

android listview 点击事件 混乱,Android listview 使用缓存以后绑定的事件出现混乱。...

public View getView(final intposition, View convertView, ViewGroup parent) {final Shop shop =al.get(position);if(map.get(position)==null){System.out.println("map 没有数据当前第"+position+"项");viewholder=newV...

weixin_39923110的博客 156

机器学习系列(1)_逻辑回归初步

1、总述 逻辑回归是应用非常广泛的一个分类机器学习算法,它将数据拟合到一个logit函数(或者叫做logistic函数)中,从而能够完成对事件发生的概率进行预测。 2、由来     要说逻辑回归,我们得追溯到线性回归,想必大家对线性回归都有一定的了解,即对于多维空间中存在的样本点,我们用特征的线性组合去拟合空间中点的分布和轨迹。如下图所示:     线性回归能对连续值结果进行预测,

寒小阳 13万+

ListView滑动过程中图片显示重复错位闪烁问题解决

转载自:点击打开链接 另可参考:点击打开链接 主要分析Android ListView滚动过程中图片显示重复、错乱、闪烁的原因及解决方法,顺带提及ListView的缓存机制。 1、原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View)。ListView通过adapter的getView函数获得每行的item...

weixin_34321753的博客 325

STM32F407编译下载全流程:从CubeMX到HEX烧录

嵌入式固件开发中,编译与下载是连接代码与硬件的关键闭环。其本质是将高级语言描述的逻辑,经交叉编译(ARM GCC)、链接(ELF生成)、格式转换(HEX/BIN)后,通过调试接口(SWD/UART)写入MCU Flash存储器的过程。该流程涉及工具链协同、二进制格式特性(如Intel HEX的地址映射与无元数据设计)、启动模式(System Memory Bootloader)、Flash选项字节(RDP/WRP)等底层机制,直接决定固件可运行性与安全性。典型应用场景包括STM32F407开发板调试、量产固

weixin_28840811的博客 260

活用QueryWrapper与@Select注解,构建MybatisPlus动态多表查询方案

本文深入探讨了如何结合MybatisPlus的QueryWrapper与@Select注解,构建高效灵活的动态多表关联查询方案。通过解析${ew.customSqlSegment}占位符机制,并设计通用的Service层封装,解决了复杂条件下多表查询的SQL拼接难题,显著提升了后台管理系统列表查询的开发效率与可维护性。

weixin_29291069的博客 271

Android ListView滑动过程中图片显示重复错位闪烁问题解决

主要分析Android ListView滚动过程中图片显示重复、错乱、闪烁的原因及解决方法,顺带提及ListView的缓存机制。 1、原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View)。ListView通过adapter的getView函数获得每行的item。滑动过程中, a. 如果某行item已经滑出屏幕,若该item不在缓

来啊 快活啊 1126

YOLOv8改进 | Conv篇 | 利用YOLOv9的GELAN模块替换C2f结构(附轻量化版本 + 高效涨点版本 + 结构图)

本文给大家带来的改进机制是利用2024/02/21号最新发布的YOLOv9其中提出的GELAN模块来改进YOLOv8中的C2f,GELAN融合了CSPNet和ELAN机制同时其中利用到了RepConv在获取更多有效特征的同时在推理时专用单分支结构从而不影响推理速度,同时本文的内容提供了两种版本一种是参数量更低涨点效果略微弱一些的版本(参数量V8n下降80w,计算量为6.1GFLOPs),另一种是参数量稍多一些但是效果要不参数量低的效果要好一些(均为我个人整理),提供两种版本是为了适配不同需求的读者,具体选择

Snu77的博客 7567

ListView三级缓存机制

1. 图片的三级缓存(基本概念) 一级缓存: 内存缓存, 缓存的是bitmap对象, 用Map<String, Bitmap>结构保存, key是url(更好的替代方案LruCache) 二级缓存: 本地(sd卡)缓存, 缓存的是图片文件, /storage/sdcard/Android/data/packageName/files/图片文件名(xxx.jpg) 三级缓存: 远程...

LINDAMAN00的博客 615

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Android在ListView显示图片(重复错乱闪烁问题)

Android在ListView显示图片(重复错乱闪烁问题)

随意而然的专栏 3132

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

RecyclerView的缓存机制

RecyclerView的缓存机制 RecyclerView缓存机制(咋复用?) 真正带你搞懂 RecyclerView 的缓存机制,再也不怕面试被虐了! 看完这篇,面试RecyclerView的时候再也不怕了 ...

shiningdreamercaihua的博客 3292

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

android listview 不显示_ListView详细介绍与使用

image前言介绍:关于 ListView 我们大家都应该是非常的熟悉了,在 Android 开发中是经常用到的,今天就再来回顾一下,ListView 的使用方法,和一些需要优化注意的地方,还有日常开发过程中的一些小技巧和经验。ListView 简介ListView 是 Android 系统为我们提供的一种列表显示的一种控件,使用它可以用来显示我们常见的列表形式。继承自抽象类 AdapterVie...

weixin_39998998的博客 2299

在listview中嵌入viewpager带来的卡顿问题及解决

现在许多应用中都有用到listview和viewpager共存的界面,像知乎日报这样

峰尖尖的专栏 2560

ListView异步加载图片--图片缓存和错位问题解决方案

问题1: 加载太多的图片很容易造成OOM异常。一、图片缓存方法1:使用二级缓存 ->自己维护一个缓存区 只要有足够的内存,就一直保持对象,直到发现内存吃紧且没有Strong Ref时才回收对象。 所以可以这么做:map里面的键是用来放图片地址的,既可以是网络上的图片地址,也可以SDcard上的图片地址, map里面的值里面放的是持有软引用的Bitmap.private Map<St

FlowLeaf 5112

探究Android中Listview显示错乱问题

问题 最近在项目中遇到过一个很棘手的问题,就是ListView在滑动后就莫名其妙的显示错乱,网上查阅资料后问题很容易的就解决了,但是对于问题产生的原因仍是一知半解,所以不甘心的我定下心来,狠读源码,终于理清了其中的”奥秘“。 由来 一般的关于Adapter中getView的写法不外乎以下形式: @Override public View getView(int position, Vie...

diechenhua0451的博客 316

Android ListView滑动过程中图片显示重复错乱闪烁问题解决

主要分析Android ListView滚动过程中图片显示重复、错乱、闪烁的原因及解决方法,顺带提及ListView的缓存机制。 1、原因分析 ListView item缓存机制:为了使得性能更优,ListView会缓存行item(某行对应的View)。ListView通过adapter的getView函数获得每行的item。滑动过程中, a. 如果某行item已经滑出屏幕,若该item

赤耳A狼 414

Android ListView分页加载时图片显示问题

1,问题描述 Android ListView需要分页加载,每个item中会有图片,图片又是从网络下载的。 问题:在滑动加载下一页时,上一页的图片明明已经下载完成了,但是无法显示出来。 2,Bug重现: 1),加载了第1页的数据,图片在后台下载(下载完成后更新ImageView),向下滑动ListView。 2),滑动到listview的最下面,请求第2页

ceko_wu的专栏 1512
上一篇: Poj 1631 Bridging signals(二分+DP 解 LIS)
下一篇: Poj 2488 A Knight's Journey(搜索)
TaiSung
博客等级 码龄15年 49粉丝 132原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值