android 面试之listview

ListView优化一直是一个老生常谈的问题,不管是面试还是平常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看如何最大化的优化ListView的性能。· 1.在adapter中的getView方法中尽量少使用逻辑· 2.尽最大可能避免GC· 3.滑动的时候不加载图片· 4.将ListView的scrollingCache和animateCache设置为false· 5.item的布局层级越烧越好· 6.使用ViewHolder1.在adapter中的getView方法中尽量少使用逻辑不要在你的getView()中写过多的逻辑代码,我们可以将这些代码放在别的地方,例如:

public View getView(int position, View convertView, ViewGroup parent) {
View item = mInflater.inflate(R.layout.list_item_icon_text, null);
((TextView) item.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) item.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return item;
}

怎么样?如果超过1000000项时,后果不堪设想!您可千万别这么写!

public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = mInflater.inflate(R.layout.item, null);
}
((TextView) convertView.findViewById(R.id.text)).setText(DATA[position]);
((ImageView) convertView.findViewById(R.id.icon)).setImageBitmap(
(position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}

那么上面的代码还可以优化吗,答案是肯定的。

public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_icon_text, null);
holder = new ViewHolder();
holder.text = (TextView) convertView.findViewById(R.id.text);
holder.icon = (ImageView) convertView.findViewById(R.id.icon);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.text.setText(DATA[position]);
holder.icon.setImageBitmap((position & 1) == 1 ? mIcon1 : mIcon2);
return convertView;
}

static class ViewHolder {
TextView text;
ImageView icon;
}

2.GC 垃圾回收器当你创建了大量的对象的时候,GC就会频繁的执行,所以在getView()方法中不要创建很多的对象,最好的优化是,不要在ViewHolder以外创建任何对象,如果你的你的log里面发现“GC has freed some memory”频繁出现的话,那你的程序肯定有问题了。你可以检查一下:a) item布局的层级是否太深b) getView()方法中是否有大量对象存在c) ListView的布局属性3.加载图片如果你的ListView中需要显示从网络上下载的图片的话,我们不要在ListView滑动的时候加载图片,那样会使ListView变得卡顿,所以我们需要再监听器里面监听ListView的状态,如果滑动的时候,停止加载图片,如果没有滑动,则开始加载图片

listView.setOnScrollListener(new OnScrollListener() {
 @Override
public void onScrollStateChanged(AbsListView listView,
int scrollState) { //停止加载图片
if (scrollState ==
AbsListView.OnScrollListener.SCROLL_STATE_FLING) {
imageLoader.stopProcessingQueue();
} else { //开始加载图片
imageLoader.startProcessingQueue();
}
} @Override
public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 
// TODO Auto-generated method stub
}
});

4.将ListView的scrollingCache和animateCache设置为falsescrollingCache: scrollingCache本质上是drawing cache,你可以让一个View将他自己的drawing保存在cache中(保存为一个bitmap),这样下次再显示View的时候就不用重画了,而是从cache中取出。默认情况下drawing cahce是禁用的,因为它太耗内存了,但是它确实比重画来的更加平滑。而在ListView中,scrollingCache是默认开启的,我们可以手动将它关闭。animateCache:
ListView默认开启了animateCache,这会消耗大量的内存,因此会频繁调用GC,我们可以手动将它关闭掉,所以我们代码可以这么写:

<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:divider="@color/list_background_color"
android:dividerHeight="0dp"
android:listSelector="#00000000"
android:scrollingCache="false"
android:animationCache="false"
android:smoothScrollbar="true" />

5.减少item的布局的深度我们应该尽量减少item布局深度,因为当滑动ListView的时候,这回直接导致测量与绘制,因此会浪费大量的时间,所以我们应该将一些不必要的布局嵌套关系去掉。减少item布局深度,这个我曾经做过一个实验,当布局嵌套超过5层的时候,Android的Decodview就会出现错误,所以请不要嵌套的太深。

6.使用ViewHolder这个大家应该非常熟悉了,但是不要小看这个ViewHolder,它可以大大提高我们ListView的性能ListView的优化我们已经讲完了。

以上是最基本的,如果你还有更好的方案补充,欢迎后面留言。或者加入我们的官方qq群:278792776

时间: 2024-10-24 19:24:53

android 面试之listview的相关文章

Android面试之高级篇

结合自己之前去很多大公司的面试经历和自己面别人的一些题,这里做一些总结,Android面试中常见的面试题. 1,Android的Handler运行机制     要解释Handler的运行机制就要讲几个对象:Message.Handler.Message Queue.Looper.Handler获取当前线程中的looper对象,looper用来从存放Message的   MessageQueue中取出Message,再有Handler进行Message的分发和处理. Message Queue(消

Android中长按Listview显示CheckBox并实现批量删除

ListView实现的列表,如果是可编辑,可删除的,一般都要提供批量删除功能,否则的话,一项一项的删 除体验很不好,也给用户带来了很大的麻烦. 实现效果图 具体实现代码 select.xml 主布局文件包含一个ListView还有一个隐藏的布局,包含了两个Button一个TextView,默认布局为gone,当 监听到长按响应事件时候显示. <?xml version="1.0" encoding="utf-8"?> <LinearLayout x

关于android动态获取listview高度的问题

问题描述 关于android动态获取listview高度的问题 最近在拿一个聊天机器人的对话板块来练手,用到了一个listview动态设定高度的问题.结果改了很多时候仍有一个bug:当scrollview开始翻页之后,每次的发送在下面都会有一段空白.当发送的消息多了之后,下面明显会多出一段空白区. 我用setenable(true)试过,点不了,所以应该不是多出来的item,但是也不知道是什么,但应该是高度获取错误,可是代码也是网上通用的,求指导,求修改,赋源代码. 谢谢.

Android开发之ListView、GridView 详解及示例代码_Android

    ListView与GridView是Android开发中的常用控件,它们和Adapter配合使用能够实现很多界面效果.下面分别以实例说明ListView.GridView的用法.        1.ListView的Android开发实例        ListView 是android开发中最常用的控件之一,一般构成列表包括三个元素,ListView:用来展示列表的视图.Adapter:数据与视图连接的桥梁.Data:具体的数据包括字符串 .图片或者控件.        适配器一般有以

Android checkbox的listView具体操作方法_Android

本文主要实现在自定义的ListView布局中加入CheckBox控件,通过判断用户是否选中CheckBox来对ListView的选中项进行相应的操作.通过一个Demo来展示该功能,选中ListView中的某一项,然后点击Button按钮来显示选中了哪些项.1.程序结构图如下: 其中Person.java是实体类,MainActivity.java是Activity组件类.listitem.xml是自定义的列表每项布局文件.2.listitem.xml布局文件源码如下: <?xml version

android怎样把listview显示的数据保存到本地

问题描述 android怎样把listview显示的数据保存到本地 我想把listview上的数据保存本地(可以是保存到SD卡中或者是sharedpreferences都可以) 解决方案 原始数据可以用序列化保存成文件,或者自己用stream保存 解决方案二: List list = new ArrayList(0); SharedPreferences sp = getSharedPreferences(""file"" MODE_PRIVATE); Editor

Android UI组件----ListView列表控件详解

[正文] 内容简介: • 1.基本的XML配置 • 2.ListActivity • 3.单选和多选模式 • 4.ListView实现图文列表 • 5.ListView刷新分页   一.基本的 XML配置: android:cacheColorHint="#00000000"  //设置拖动背景色为透明 android:dividerHeight="30px"  //listview item之间的高度(即分格条的高度) android:divider="

Android研究院之ListView原理学习与优化总结

转载自雨松MOMO程序研究院本文链接地址:Android研究院之ListView原理学习与优化总结(二十一) 列表的显示需要三个元素: ListVeiw: 用来展示列表的View. 适配器 : 用来把数据映射到ListView上 数据: 具体的将被映射的字符串,图片,或者基本组件. 根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,这三种适配器的使用大家可学习下官网上面的使用或者自行百度谷歌,一堆DEMO!!!其中以

android开发中listview添加图片

问题描述 android开发中listview添加图片 map1.put("image",R.drawable.jiantou); 我在listview中添加图像时,引用图像的地址,如上所示,但提示错误The method put(String, String) in the type HashMap is not applicable for the arguments (String, int) 但我看别人的代码都可以直接引用图像地址的,请大神帮忙解决一下,谢啦!! 解决方案 Ma