尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

【提升栈】ListView优化

【提升栈】ListView优化 前言ListView优化一直是一个老生常谈的问题。无论是面试还是寻常的开发中ListView永远不会被忽略掉那么这篇文章我们来看看怎样最大化的优化ListView的性能。1.在adapter中的getView方法中尽量少使用逻辑2.尽最大可能避免GC3.滑动的时候不载入图片4.将ListView的scrollingCache和animateCache设置为false5.item的布局层级越烧越好6.使用ViewHolder1.在adapter中的getView方法中尽量少使用逻辑不要在你的getView()中写过多的逻辑代码我们能够将这些代码放在别的地方。比如优化前的getViewOverride 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; }优化后的getViewOverride 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设置为falsescrollingCache:scrollingCache本质上是drawing cache你能够让一个View将他自己的drawing保存在cache中保存为一个bitmap这样下次再显示View的时候就不用重画了而是从cache中取出。默认情况下drawing cahce是禁用的。由于它太耗内存了可是它确实比重画来的更加平滑。而在ListView中scrollingCache是默认开启的我们能够手动将它关闭。animateCache:ListView默认开启了animateCache这会消耗大量的内存因此会频繁调用GC我们能够手动将它关闭掉优化前的ListViewListView android:idandroid:id/list android:layout_widthmatch_parent android:layout_heightwrap_content android:cacheColorHint#00000000 android:dividercolor/list_background_color android:dividerHeight0dp android:listSelector#00000000 android:smoothScrollbartrue android:visibilitygone /优化后的ListViewListView android:idandroid:id/list android:layout_widthmatch_parent android:layout_heightwrap_content android:dividercolor/list_background_color android:dividerHeight0dp android:listSelector#00000000 android:scrollingCachefalse android:animationCachefalse android:smoothScrollbartrue android:visibilitygone /5.降低item的布局的深度我们应该尽量降低item布局深度由于当滑动ListView的时候这回直接导致測量与绘制因此会浪费大量的时间。所以我们应该将一些不必要的布局嵌套关系去掉。降低item布局深度6.使用ViewHolder这个大家应该非常熟悉了可是不要小看这个ViewHolder它能够大大提高我们ListView的性能后文ListView的优化我们已经讲完了。假设在你的项目中。这些基本优化你还没有做到的话。那么你的ListView是有问题的还有非常大的提升潜力。以后再使用ListView的时候一定要将这几点考虑进去发挥它的最大的性能。这些东西其实只要技术到了一定高度经验多了就很稀疏平常。学无止境更多的知识在等着我们去学习。需要学习进阶框架技术的可以扫码领取资料**《Android架构开发手册》**Android进阶框架学习教材由于文章内容比较多篇幅有限资料已经被整理成了PDF文档有需要**《Android架构开发手册》**完整文档的可以加微信 即可免费领取!### **目录**
返回列表