android 开发 listview 深度优化,Android性能优化之提高ListView性能的技巧

ListView优化一直是一个老生常谈的问题。无论是面试还是寻常的开发中,ListView永远不会被忽略掉,那么这篇文章我们来看看怎样最大化的优化ListView的性能。

1.在adapter中的getView方法中尽量少使用逻辑

2.尽最大可能避免GC

3.滑动的时候不载入图片

4.将ListView的scrollingCache和animateCache设置为false

5.item的布局层级越烧越好

6.使用ViewHolder

1.在adapter中的getView方法中尽量少使用逻辑

不要在你的getView()中写过多的逻辑代码,我们能够将这些代码放在别的地方。比如:

优化前的getView():

@Override

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

Object current_event = mObjects.get(position);

ViewHolder holder = null;

if (convertView == null) {

holder = new ViewHolder();

convertView = inflater.inflate(R.layout.row_event, null);

holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);

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

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

//在这里进行逻辑推断。这是有问题的

if (doesSomeComplexChecking()) {

holder.ThreeDimention.setVisibility(View.VISIBLE);

} else {

holder.ThreeDimention.setVisibility(View.GONE);

}

// 这是设置image的參数,每次getView方法运行时都会运行这段代码。这显然是有问题的

RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);

holder.EventPoster.setLayoutParams(imageParams);

return convertView;

}

优化后的getView():

@Override

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

Object object = mObjects.get(position);

ViewHolder holder = null;

if (convertView == null) {

holder = new ViewHolder();

convertView = inflater.inflate(R.layout.row_event, null);

holder.ThreeDimension = (ImageView) convertView.findViewById(R.id.ThreeDim);

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

//设置參数提到这里,仅仅有第一次的时候会运行,之后会复用

RelativeLayout.LayoutParams imageParams = new RelativeLayout.LayoutParams(measuredwidth, rowHeight);

holder.EventPoster.setLayoutParams(imageParams);

convertView.setTag(holder);

} else {

holder = (ViewHolder) convertView.getTag();

}

// 我们直接通过对象的getter方法取代刚才那些逻辑推断。那些逻辑推断放到别的地方去运行了

holder.ThreeDimension.setVisibility(object.getVisibility());

return convertView;

}

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设置为false

scrollingCache: 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:cacheColorHint="#00000000"

android:divider="@color/list_background_color"

android:dividerHeight="0dp"

android:listSelector="#00000000"

android:smoothScrollbar="true"

android:visibility="gone" />

优化后的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"

android:visibility="gone" />

5.降低item的布局的深度

我们应该尽量降低item布局深度,由于当滑动ListView的时候,这回直接导致測量与绘制,因此会浪费大量的时间。所以我们应该将一些不必要的布局嵌套关系去掉。降低item布局深度

6.使用ViewHolder

这个大家应该非常熟悉了,可是不要小看这个ViewHolder,它能够大大提高我们ListView的性能

ListView的优化我们已经讲完了。假设在你的项目中。这些基本优化你还没有做到的话。那么你的ListView是有问题的,还有非常大的提升潜力。以后再使用ListView的时候,一定要将这几点考虑进去,发挥它的最大的性能。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值