1、listview优化问题

(参考http://www.androidmi.com/Androidkaifa/jinjie/201101/2678.html)

针对ListView卡的要死的问题,有一个广为流传的 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来回拖拽毫无压力。





更多相关文章

  1. Android(安卓)4.4KitKat AudioFlinger 流程分析
  2. Android实现导航栏的左右滑动效果
  3. Android(安卓)使用volley过程中遇到的问题解决办法
  4. android studio使用volley发送post和get请求
  5. android 异步加载图片缩略图
  6. Android应用程序组件Content Provider的启动过程源代码分析(7)
  7. android adapter的性能小结
  8. [Android]加载外部.9图片
  9. Android加载网络图片

随机推荐

  1. Android(安卓)代码实现logcat输出到文件
  2. linux下配置android sdk
  3. Android(安卓)为【apk】文件签名,增加修改
  4. 2012 年最佳 Android(安卓)应用
  5. [camera drv]工厂模式下测试camera fail
  6. Android(安卓)Animation (动画设计)
  7. Android(安卓)TV开发(—)开始电视应用
  8. Android(安卓)studio 启动模拟器时解决 V
  9. Android(安卓)Http请求框架二:xUtils 框架
  10. 2011.07.05(4)——— android 抖动效果