http://www.2cto.com/kf/201108/99928.html

项目用到ListView,由于要用到ImageView,图片源不是在资源里面的,没法使用资源ID,因此无法直接使用SimpleAdapter,要自己写一个Adapter。在使用ListView和Adapter需要注意以下几点:

1. Adapter.getView()

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

这个方法就是用来获得指定位置要显示的View。官网解释如下:

Get a View that displays the data at the specified position in the data set. You can either create a View manually or inflate it from an XML layout file.

当要显示一个View就调用一次这个方法。这个方法是ListView性能好坏的关键。方法中有个convertView,这个是Android在为我们而做的缓存机制。

ListView中每个item都是通过getView返回并显示的,假如item有很多个,那么重复创建这么多对象来显示显然是不合理。因此,Android提供了Recycler,将没有正在显示的item放进RecycleBin,然后在显示新视图时从RecycleBin中复用这个View。

Recycler的工作原理大致如下:

假设屏幕最多能看到11个item,那么当第1个item滚出屏幕,这个item的View进入RecycleBin中,第12个要出现前,通过getView从回收站(RecycleBin)中重用这个View,然后设置数据,而不必重新创建一个View。

我们用Android提供的APIDemos来验证这个过程:

先看关键代码:

Java代码

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

// A ViewHolder keeps references to children views to avoid unneccessary calls

// to findViewById() on each row.

ViewHolder holder;

// When convertView is not null, we can reuse it directly, there is no need

// to reinflate it. We only inflate a new View when the convertView supplied

// by ListView is null.

if (convertView == null) {

convertView = mInflater.inflate(R.layout.list_item_icon_text, null);

Log.v("tag", "positon " + position + " convertView is null, " + "new: " + convertView);

// Creates a ViewHolder and store references to the two children views

// we want to bind data to.

holder = new ViewHolder();

holder.text = (TextView) convertView.findViewById(R.id.text);

holder.icon = (ImageView) convertView.findViewById(R.id.icon);

convertView.setTag(holder);

} else {

// Get the ViewHolder back to get fast access to the TextView

// and the ImageView.

holder = (ViewHolder) convertView.getTag();

Log.v("tag", "positon " + position + " convertView is not null, "  + convertView);

}

// Bind the data efficiently with the holder.

holder.text.setText(DATA[position]);

holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);

return convertView;

}

static class ViewHolder {

TextView text;

ImageView icon;

}

效果图:

可以看到,一打开Activity,看到10个item.

我们看看Log信息:

可以看出,每次convertView都是null, 都是新建一个View来显示的。

当我们向下滑动,如下图,

由于item0和item10都显示一半,所以item10也是新建出来,但是当要显示item11的时候,由于item0已经不在屏幕上,所以item11复用了item0的实例。可以从

以下Log信息看出:

我们分析Log信息,可以看出item11的对象是item0,item12的对象是item1,如此类推。

这样,通过复用convertView,就可以避免每次都新建View,节省内存而且优化ListView的滑动效果。

2.  ListView的Layout XML

除了上述说的,还有一个要点就是ListView在Layout XML中的描述。

先看问题:

有时,我们可能会看到一打开ListView,getView会重复调用好次(假设屏幕最多可以看到6个item),如下图:

一直重复0-6,  0-5,0-5,0-5,0-5,0-5。而且,convertView一开始都是同一个View,这个是因为ListView的

android:layout_height="wrap_content"。

我们修改为android:layout_height="fill_parent",Log信息如下:

可以看出,修改之后ListView的getView调用恢复和Recycler的行为一致。

至于为什么使用wrap_content会出现重复调用的情况,我还没有研究过。不过初步觉得是因为在Android描绘ListView的时候,由于不清楚高度,所以使用一个item去试探ListView在屏幕中的最大高度所引起。希望有知道的朋友能够告诉,先谢谢了!

最后,如果上面有什么地方说错的话,希望能够指出,互相进步嘛。

listview优化的更多相关文章

  1. listview优化 汇总

    1,listview加载性能优化ViewHolder 转自: http://blog.csdn.net/jacman/article/details/7087995 在android开发中Listvi ...

  2. Android 常驻与很驻型广播的差别,及ListView优化,Android新手基本知识巩固

    1.常驻型广播  常驻型广播,当你的应用程序关闭了,假设有广播信息来,你写的广播接收器相同的能接受到.  他的注冊方式就是在你的应用程序中的AndroidManifast.xml进行注冊. 通常说这样 ...

  3. 内存泄露--contentView缓存使用与ListView优化

    引起Android内存泄露有很多种原因,下面罗列了一些问题,以后会一一解决 1.构造Adapter时没有使用缓存convertView(衍生出ListView优化问题) 2.查询数据库游标没有关闭 3 ...

  4. Android——ListView优化

    1.ListView基本概念 列表显示需要三个元素: ListView:用来展示列表的View. 适配器:用来把数据映射到ListView上 数据:具体的将被映射的字符串,图片或基本组件 适配器类型分 ...

  5. Android零基础入门第43节:ListView优化和列表首尾使用

    原文:Android零基础入门第43节:ListView优化和列表首尾使用 前面连续几期都在学习ListView的各种使用方法,如果细心的同学可能会发现其运行效率是有待提高的,那么本期就来一起学习有哪 ...

  6. Adaptert Listview 优化

    这次是关于Listview的优化的,之前一直采用愚蠢的方式来使用listview,出现的情况就是数据多的话下拉的时候会出现卡顿的情况,内存占用多.所以学习了关于listview的优化,并且这也是普遍使 ...

  7. Android开发之ListView详解 以及简单的listView优化

    ListView列表视图 最常用的控件之一,使用场景例如:微信,手机QQ等等. android:divider:每个item之间的分割线,可以使用图片或者色值. android:dividerHeig ...

  8. listview优化技术

    1.在adapter中的getView方法中尽量少使用逻辑 2.尽最大可能避免GC 3.滑动的时候不加载图片 4.将ListView的scrollingCache和animateCache设置为fal ...

  9. ListView优化中ViewHolder要不要定义为static静态内部类?

    给学生讲课的时候,发现存在这个问题,下来百度了下,发现很纠结,涉及到了内部类对外部类的引用,静态类的生命周期等java知识,现总结如下: static class ViewHolder { //定义l ...

  10. Android性能优化--Listview优化

    ListView的工作原理 首先来了解一下ListView的工作原理(可参见http://mobile.51cto.com/abased-410889.htm),如图: ListView 针对每个it ...

随机推荐

  1. Github获取仓库最新Release版本号API

    package me.chunsheng.hongbao.utils; import android.content.Context; import android.content.Intent; i ...

  2. Sublime Text2 快捷键设置

    设置Tab两个空格: 点击 Preference -> Settings-User "tab_size":2, "translate_tabs_to_spaces& ...

  3. drupal7创始人root忘记密码的解决办法

    在index.php中的drupal_bootstrap(DRUPAL_BOOTSTRAP_FULL);之后加入 require_once 'includes/password.inc'; echo ...

  4. Python之路第八天,基础(9)-面向对象(下)

    类的成员 类的成员可以分为三大类:字段.方法和属性 注:所有成员中,只有普通字段的内容保存对象中,即:根据此类创建了多少对象,在内存中就有多少个普通字段.而其他的成员,则都是保存在类中,即:无论对象的 ...

  5. python针对于mysql的增删改查

    无论是BS还是CS得项目,没有数据库是不行的. 本文是对python对mysql的操作的总结.适合有一定基础的开发者,最好是按部就班学习的人阅读.因为我认为人生不能永远都是从零开始,那简直就是灾难. ...

  6. Docker学习笔记之一,搭建一个JAVA Tomcat运行环境

    Docker学习笔记之一,搭建一个JAVA Tomcat运行环境 前言 Docker旨在提供一种应用程序的自动化部署解决方案,在 Linux 系统上迅速创建一个容器(轻量级虚拟机)并部署和运行应用程序 ...

  7. fstab 介绍

    http://forum.ubuntu.org.cn/viewtopic.php?t=58468 主要翻译自http://www.tuxfiles.org/linuxhelp/fstab.html,根 ...

  8. Baidu Sitemap Generator插件使用图解教程

    这两天因为百度对本博客文章收录更新很慢,一直在网络查找真正的原因和解决方法.最终发现了柳城开发的Baidu Sitemap Generator WordPress插件,最终效果如果还需要验证一段时间. ...

  9. 【LeetCode练习题】Reverse Linked List II

    Reverse Linked List II Reverse a linked list from position m to n. Do it in-place and in one-pass. F ...

  10. 灵活使用getconf命令来获取系统信息

    http://blog.chinaunix.net/uid-23105261-id-109513.html 灵活使用getconf命令来获取系统信息 我们时常需要查询系统相关的信息,比如页面大小,整数 ...