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-11 00:39:43

android 面试之listview的相关文章

Android面试知识点(转)

该文所有问题转自:http://www.cnblogs.com/hpboy/p/3307371.html 一.算法,数据结构 1.排序算法 2.查找算法 3.二叉树 4.广度,深度算法: 二.java基础 1.集合Collection,List,Map等常用方法,特点,关系: 2.线程的同步,中断方式有几种,线程池,线程状态,常用的方法比较,比如wait,sleep等: 3.反射机制 4.IO包的使用,运用了什么设计模式 5.设计模式,常用的设计模式,运用场景: 6.内存管理,引用的种类: 7.

【Android 面试基础知识点整理】

针对Android面试中常见的一些知识点整理,Max 只是个搬运工,感谢本文中引用文章的各位作者,给大家分享了这么多优秀文章,对于其中的解析,是原作者个人见解,有错误和不准确的地方,也请大家积极指正. 本文将持续更新,同时我也将其放在Github上:Point-of-Android 同时可以看Max的个人博客:海上钢琴师 Android中的异步任务机制 Android中AsyncTak的使用与源码分析 http://blog.csdn.net/bboyfeiyu/article/details/

百度的android面试总结分析

今天就是今天上午10点,我接到了百度的电话面试,当然提前和我说了,我的拖延症是有多强烈,以至于我没怎么准备,当然我也想着看看自己的真实水平,在此检讨一下!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 废话不多说 上来就是百度的一个技术人员打过电话来,简单确认了我的信息之后,就开始问问题,此刻我的心中有一万匹草泥马奔腾....开始问的是数据结构和算法的相关知识,我本科学过一小点,不过没有及时复习全忘记了...接下来就是

扫清 Android 面试障碍--面试前的准备及必刷面试题

又准备要去面试了吗? 来来来,给你点干货建议. 磨刀不误砍柴工, 面试的时间一般只有几个小时不到,所以做好充分准备会极大提高你的成功率.面试的要点分: 面试前的准备和面试中的注意事项,接下来先来说说面试前的准备. 面试前准备 毋庸置疑,求职者在面试之前必须做好充足的准备,我认为有以下几点是重中之重: 完善简历,以及对简历内容做充分准备 可以说简历内容不在于多而在于精,尽量让每个字都有信息量,而且千万要中肯,比如说对于三年以内工作经验的,还是不要用「精通」这两个字了,会让面试官觉得你很浮夸. 坦率

Android 监听ListView、GridView滑动到底部

// 监听listview滚到最底部mIndexList.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { // 当不滚动时 case OnScrollListener.SCROLL_STATE_IDLE: // 判断滚动到底部 if (view.get

[android]完美解决ListView加载网络图片乱跳问题

为什么 先说一下为什么会出现图片乱跳. 使用convertView对ListView的每个item优化,item的复用可以有效降低内存的占用,使ListView滑动更为流畅.但会带来一个问题,当最顶部的item滑出屏幕时,会变成下一个从底部将要滑进来的item.每次滑进来的item都要去请求网络获得图片. 第一个item滑出去时,是带着图片的.其ImageView指向了一块内存.当其慢慢滑出,从底部慢慢滑进时,底部的item与顶部(只有一半在屏幕里能看到了)的还是指向 同一块内存.加载的了同一张

Android——ViewPager+Fragment+ListView之间

Android--ViewPager+Fragment+ListView之间 <span style="font-size:18px;">package com.example.jreduch05; import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.view.ViewPager; import android.support.v7.app.A

android笔记:ListView及ArrayAdapter

ListView用于展示大量数据,而数据无法直接传递给ListView,需要借助适配器adapter来完成. ArrayAdapter是最常用的adapter,可以通过泛型来指定要适配的数据类型. ArrayAdapter的参数如下: android.widget.ArrayAdapter.ArrayAdapter<String>(Context context, int textViewResourceId, String[] objects) 构造函数的参数解析如下: Context co

Android—自定义控件实现ListView下拉刷新

这篇博客为大家介绍一个android常见的功能——ListView下拉刷新(参考自他人博客,网址忘记了,阅读他的代码自己理解注释的,希望能帮助到大家): 首先下拉未松手时候手机显示这样的界面: 下面的代码是自定的扎样的控件: package com.dhsr.smartID.view; import android.content.Context; import android.util.AttributeSet; import android.view.Gravity; import andr