文档章节

ListView的缓存数据复用导致的显示错乱问题

shenhuniurou
 shenhuniurou
发布于 2017/03/23 21:19
字数 383
阅读 117
收藏 0

ListView的缓存复用机制虽然提升了它的性能,但是也带来了不少的问题。

场景:每个item中有一个或多个标签,由后台返回一个字符串,app拿到数据后根据特定字符切割成字符串数组,每个标签显示一个字符串,最多显示两行。

问题:第一次加载了所有数据后,刚刚滑动ListView时,所有的标签view会闪一下。因为开始我的做法是这些显示标签的TextView都放在一个LinearLayout中,动态添加,那么在adapter每次调用getView方法时,循环添加标签时会removeAllViews将这个LinearLayout中的所有子view删除,也就是这个删除过程引起的闪烁。

解决方案:第一次调用getView时tag为空,动态添加了标签view后给LinearLayout设置一个tag,后面复用再次调用getView时,先判断tag是否为空或者当前的tag值和获取到的标签字符串是否相同,为空或者不相等时才允许循环添加标签view到LinearLayout中。

String labels = merchant.getLabels();
String[] tags = labels.split("~`~");
float tagLength = 0;
if (tags != null && tags.length > 0) {
	holder.business_tag.setVisibility(View.VISIBLE);
	String tag = (String) holder.business_tag.getTag();
	if (StringUtil.isEmpty(tag) || !labels.equals(tag)) {
		holder.business_tag.setTag(labels);
		holder.business_tag.removeAllViews();
		holder.business_tag_two.removeAllViews();
		for (int i = 0; i < tags.length; i++) {
			TextView textView = (TextView) inflater.inflate(R.layout.layout_merchant_tag, null);
			textView.setText(tags[i]);
			LinearLayout.LayoutParams params = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
			params.setMargins(0, 0, 5, 0);
			textView.setLayoutParams(params);
			TextPaint paint = textView.getPaint();
			float width = paint.measureText(tags[i]);
			tagLength += (width + 3 * 5);
			if (tagLength > tagWidth) {
				holder.business_tag_two.setVisibility(View.VISIBLE);
				holder.business_tag_two.addView(textView);
			} else {
				holder.business_tag.addView(textView);
			}
		}
	}
} else {
	holder.business_tag.setVisibility(View.GONE);
}

© 著作权归作者所有

shenhuniurou
粉丝 19
博文 78
码字总数 63826
作品 0
广州
Android工程师
私信 提问
商城购物车加减控件的简单封装(续),解决ListView中数据错乱的问题

在上一篇文章中,我们学习了商城购物车加减控件的简单封装,知道了封装的思路过程和使用方法。还没有看过上一篇文章的朋友,建议先去阅读 商城购物车加减控件的简单封装 。这段时间收到一些小...

sinat_36668731
2017/08/17
0
0
Android ListView滑动过程中图片显示重复错乱闪烁问题解决

最新内容建议直接访问原文:Android ListView滑动过程中图片显示重复错乱闪烁问题解决 主要分析Android ListView滚动过程中图片显示重复、错乱、闪烁的原因及解决方法,顺带提及ListView的缓...

Trinea
2013/08/07
29K
4
Listview中的嵌套EditView等抢焦点view

上面其实是我为了尝试listview使用缓存 因为是焦点组件,需要记录一些Focus焦点位置,而viewHolder为缓存着复用组件所以每次每次获取到Viewholder 都需要在getview里比较靠前的位置先把里面的...

yizhihaohut
2015/12/25
714
0
UniversalImageLoader处理图片错乱

universalImageloader是怎么让listview复用的图片不错乱的?在最终的displayImage()方法中,准备好targetSize后 这行代码prepareDisplayTaskFor(xxx)`void prepareDisplayTaskFor(ImageAware ......

希望慢慢好起来
2016/04/02
165
0
深入理解移动开发的模板复用机制

模板复用机制是android,ios等移动开发技术中类似listview,gridview,slideview等等之类组件常用的技术,deviceone的模板复用完全是和他们一致,deviceone有很多组件基本上涉及到多数据和模板...

voxer
2016/04/19
271
0

没有更多内容

加载失败,请刷新页面

加载更多

rime设置为默认简体

转载 https://github.com/ModerRAS/ModerRAS.github.io/blob/master/_posts/2018-11-07-rime%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E7%AE%80%E4%BD%93.md 写在开始 我的Arch Linux上......

zhenruyan
今天
4
0
简述TCP的流量控制与拥塞控制

1. TCP流量控制 流量控制就是让发送方的发送速率不要太快,要让接收方来的及接收。 原理是通过确认报文中窗口字段来控制发送方的发送速率,发送方的发送窗口大小不能超过接收方给出窗口大小。...

鏡花水月
今天
8
0
OSChina 周日乱弹 —— 别问,问就是没空

Osc乱弹歌单(2019)请戳(这里) 【今日歌曲】 @tom_tdhzz :#今日歌曲推荐# 分享容祖儿/彭羚的单曲《心淡》: 《心淡》- 容祖儿/彭羚 手机党少年们想听歌,请使劲儿戳(这里) @wqp0010 :周...

小小编辑
今天
877
10
golang微服务框架go-micro 入门笔记2.1 micro工具之micro api

micro api micro 功能非常强大,本文将详细阐述micro api 命令行的功能 重要的事情说3次 本文全部代码https://idea.techidea8.com/open/idea.shtml?id=6 本文全部代码https://idea.techidea8....

非正式解决方案
今天
5
0
Spring Context 你真的懂了吗

今天介绍一下大家常见的一个单词 context 应该怎么去理解,正确的理解它有助于我们学习 spring 以及计算机系统中的其他知识。 1. context 是什么 我们经常在编程中见到 context 这个单词,当...

Java知其所以然
昨天
6
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部