`
ipjmc
  • 浏览: 708142 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ListView的优化

阅读更多

    无视此文,不推荐此方法
我们觉得ListView卡卡的时候就会自然的去寻找优化大法,LZ也一样。一方面拼命优化view的结构一方面另外找到了这么一个广为流传的 ViewHolder、ViewCache办法:


public View getView(int position, View convertView, ViewGroup parent) {

	ViewHolder holder;
	if (convertView == null) {
		holder = new ViewHolder();
		convertView = inflater.inflate(R.layout.topic_list, null);
		holder.title = (TextView) convertView.findViewById(R.id.title);
		convertView.setTag(holder);
	} else {
		holder = (ViewHolder) convertView.getTag();
	}
}

public class ViewHolder {
	public TextView getTitle() {
		if (title == null) {
			title = (TextView) baseView.findViewById(R.id.title);
		}
		return title;
	}
}


大概思想是setTag();getTag();来保存已经加载过了的 ViewHolder 组件,现在我称ViewHolder 为ABCD 意为毫无特殊意义的类,顶多用到了单例的思想但是我觉得这些都是毫无意义的, 用tag来保存ViewHolder 这个属于耍小聪明的意思,曲解了tag的本意。另外整个代码并没有真正达到需要的要求Listview的展现可以看成是分页,系统会加载第一页 我们从写getView 的时候convertView是null 可以看成是第一页的样式没有被初始化。
这个时候我们


holder = new ViewHolder();
convertView = inflater.inflate(R.layout.topic_list, null); 
holder.title = (TextView) convertView.findViewById(R.id.title); 


开始进行初始化的工作,”第二页“之后这些不必再进行,所以 我认为网上所说的优化指的就是减少“第一页”之后的View创建。这个确实是不错。但是这种优化没有实质上的改进,有时候我在想为什么全部加载完毕listView回拉还会调用getView()把我的一些初始化代码再来一遍?这个显然是不合理的,而且不仅仅是初始化问题,一个listView之所以卡主要原因在于来回的进行逻辑操作,例如:listView里面有imageview 而且里面的image是从网络上的,而且你没有存到本地之类的处理,而且显示出来的时候还要根据width来控制整张图片的尺寸进行缩放,加载listview不可避免的需要做这些操作也就算了,如果已经加载过了这些数据
在来回拖拽的时候也要再操作一遍就会令人无法忍受!怎么去优化?一方面,我们知道了第一页之后不必要再new 新的View出来,另外一方面我们知道了最重要的是View的内容部能来回、重复初始化。个人觉得android里面应该有这样的“属性”或者“设置” 让每一项加载过之后不需要再加载直接使用”缓存“的数据。但是我没有发现这种“设置”,于是我在Adapter 里面用一个HashMap<Integer, View> 储存对应的View


HashMap<Integer, View> m = new HashMap<Integer, View>();

public View getView(int position, View view, ViewGroup parent) {

	View convertView = m.get(position);
	if (convertView != null) {
		return convertView;
	} else {
		convertView = inflater.inflate(R.layout.topic_list, null);
		TextView title = (TextView) convertView.findViewById(R.id.title);
		m.put(position, convertView);
	}
}

暂时就这样了,潜在的问题和其他优化没有细想,成果是 20行带较大的图片的listView来回拖拽毫无压力。
分享到:
评论
3 楼 ipjmc 2011-10-21  
mypyg 写道
图片多了vm的内存就要爆了。

没错,内存已经爆了。还是用ViewHolder靠谱
2 楼 xiaohuaduo8 2011-10-09  
楼上正解,你这种肯定是不行的,图片多的时候肯定要FC的
第一,你getView的时候没有用缓存,即第二个参数view
第二,用hashmap还不如用WeakReference,至少不会FC
1 楼 mypyg 2011-10-07  
图片多了vm的内存就要爆了。

相关推荐

    ListView优化

    ViewHolder设计模式是ListView优化的关键。它的主要思想是减少findViewById()的调用次数,提高视图查找的效率。在getView()方法中,我们通常会通过convertView参数获取到一个已经创建过的视图,如果这个视图可以复用...

    android之listview优化+分类显示

    1. **ViewHolder模式**:这是ListView优化的核心。通过复用convertView,避免频繁创建新的View对象。ViewHolder模式确保了每个item的视图状态在滚动时能得到快速恢复,降低了内存分配和对象创建的开销。在`getView()...

    ListView优化及加载图片时内存溢出

    1. **ListView优化策略** - **ViewHolder模式**:为了解决ListView滚动时频繁创建与销毁视图导致的性能问题,我们可以使用ViewHolder设计模式。这个模式缓存了视图的引用,减少了findViewById()的调用次数,提高了...

    listview 优化

    综上所述,CocosCreator的ListView优化涉及到多方面的策略,包括复用机制、数据绑定、异步加载、绘制优化等。通过使用`GListView.js`这样的扩展库,开发者可以更好地控制ListView的行为,提高应用在处理大量数据时的...

    ListView优化Demo

    总结,ListView优化主要包括视图复用、适配器优化、ViewHolder模式、数据分页加载等,而`SwipeRefreshLayout`提供了便捷的下拉刷新功能。通过这些策略,我们可以使ListView在处理大数据量时仍保持流畅,提供更好的...

    最经典的listView优化demo

    本教程将通过"最经典的listView优化demo",为初学者提供一份详尽的Android ListView适配器优化实践。 首先,我们要理解ListView的工作原理。ListView采用了一种叫做“视图复用”的机制,即只有当前屏幕可见的几项...

    listview优化图片缓存例子

    本示例“listview优化图片缓存例子”将详细介绍如何利用缓存策略来提高ListView加载图片的效率。 一、图片缓存的重要性 在ListView中,由于屏幕空间有限,只有部分列表项可见。当用户滚动时,一些不再可视的列表项...

    Android开发之listview优化+图片异步加载缓存+避免图片显示闪烁

    ListView优化** ListView的优化主要涉及以下几个方面: 1.1 **convertView复用机制**:ListView的Adapter中,`getView()`方法会创建并填充新的视图,但为了提高性能,应充分利用convertView,通过`convertView....

    ListView的优化及分类显示

    1. **使用ViewHolder模式**:这是ListView优化的核心,通过复用convertView来减少 findViewById 的次数,提高性能。ViewHolder类存储了ListView项布局中的各个视图引用,当需要创建新视图时,直接从ViewHolder中获取...

    解析json实现listview,listView优化、子控件点击事件等实现

    文件"ListView"可能是示例代码,包含了一个简单的ListView应用实例,包括JSON解析、Adapter实现、ListView优化、图片加载和子控件点击事件处理等功能。通过查看和学习这个代码,你可以更好地理解和掌握上述知识点。...

    Android ListView优化 异步加载图片

    五、ListView优化策略 1. 使用 ViewHolder 设计模式:缓存convertView中的子视图,避免每次绑定数据时的查找操作。 2. 图片缓存:利用内存缓存和磁盘缓存,如使用Universal Image Loader、Picasso或Glide库,它们...

    listview优化

    以下是对ListView优化的一些关键点和策略的详细说明: 1. **复用convertView**:ListView的工作机制是基于视图缓存的,即只有当前屏幕可见的item需要被创建。convertView参数在getView方法中用于传递已经创建并可以...

    android BaseAdapter listView优化

    本篇文章将深入探讨ListView与BaseAdapter的工作原理,并详细介绍如何进行性能优化。 首先,我们来理解一下Adapter在Android中的作用。Adapter是连接数据源和UI组件的桥梁,它负责将数据转化为可显示的视图。在...

    Android ListView性能优化

    ViewHolder模式是ListView优化的核心技巧,它可以避免在滚动时频繁地创建和查找视图对象。通过创建一个ViewHolder类来持有每个列表项视图中的子视图引用,并在getView()方法中重用已存在的ViewHolder,可以显著减少...

    ListView优化示例源码

    以下是对"ListView优化示例源码"的详细解读。 1. **复用机制**:ListView的核心优化策略是视图复用,即`convertView`。在`getView()`方法中,如果传入的convertView不为空,那么我们就可以复用这个已经创建过的视图...

    android listview 优化 实例

    ViewHolder模式是ListView优化的核心策略之一。它通过缓存convertView中的子View,减少findViewById()的调用次数,从而提升性能。创建一个ViewHolder类,持有ListView每一项所需的视图引用,然后在getView()方法中...

    ListView 优化

    ViewHolder模式是ListView优化的关键。它通过缓存convertView的子视图,减少findViewById的调用次数,提高滚动时的性能。在getView()方法中,先检查convertView是否为空,如果不空,则直接通过ViewHolder获取视图,...

    listView优化

    以下是一些关于ListView优化的关键知识点: 1. **分页加载**:在处理大数据集时,不应一次性加载所有数据,而是采用分页加载策略。当用户滚动到列表底部时,通过异步请求加载更多数据。这样可以减少内存消耗,提高...

    listview优化比较

    综上所述,ListView优化是一个多方面的工作,包括缓存策略、数据加载方式、图片处理等多个环节。通过对这些环节的优化,我们可以显著提高ListView的性能,提供更流畅的用户体验。在实际开发中,结合“无缓存”、“一...

Global site tag (gtag.js) - Google Analytics