我有篇博客教大家如何利用 convertView 以及 viewHolder(static) 改善 ListView 卡顿情况;但是在 ListView 加载大量复杂布局和图片的时候,即使使用了 convertView 和 viewHolder,ListView还是卡顿,本文主要讨论了如何在加载复杂 list_item 同时保证 ListView 流畅性。
核心思想是
监听滑动据加载,异步加载数据。
getView 函数一定不能耗时,有耗时任务要异步加载。
主要的方法:
先判断当前 ListView 的状态,只有 ListView 停止滑动才开启新线程加载数据,其他状态均忽略。
使用 getFirstVisiblePosition 和 getLastVisiblePosition 方法来显示 item。
耗时任务一定不要在 getView 方法中进行,最好异步进行。
具体代码如下:
//1. 判断listView状态 AbsListView.OnScrollListener onScrollListener = new AbsListView.OnScrollListener() {// ListView // 触摸事件 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { } public void onScrollStateChanged(AbsListView view, int scrollState) { switch (scrollState) { case AbsListView.OnScrollListener.SCROLL_STATE_FLING:// 滑动状态 threadFlag = false; break; case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 停止 threadFlag = true; startThread();//开启新线程,加载数据 break; case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 触摸listView threadFlag = false; break; default: // Toast.makeText(contextt, "default", // Toast.LENGTH_SHORT).show(); break; } } };
相信做到以上三点,就能运用自如的使用 ListView了,O(∩_∩)O哈哈~
ListView优化汇总:
1、UI优化:
listview条目与条目之间的间隙的分割内容 : android:divider="@android :color/transparent"
listview条目之间的间隙 : android:paddingTop="5.0dip"
listview点中的颜色变化 : android:listSelector="@color/transparent"
如果listview有很多个条目 ,在listview的右边 会显示出来一个快速滚动的进度条 : android:fastScrollEnabled="true"(listview里面的条目至少要滚动5个屏幕以上)
android:scrollbarStyle="outsideOverlay"
android:scrollbars="none"
footer view
header view
快速拖动时候的悬浮提示(window manager)
2、数据适配性能优化:
a.传统方式:
复用历史缓存的view对象, convertView 减少 采用布局填充器服务 填充布局的次数,达到减少xml->view 操作的次数.
定义了静态的viewholder 储存了 view对象里面控件的引用, view.setTag() view.getTag(); 减少遍历view对象 树状结构的次数.
b.采用了内存缓存,缓存一些经常使用的数据:
服务器上的图片,缓存这些图片,(缓存手机的Rom卡,sd卡)利用softreference把图片给缓存到内存里面;
再比如缓存从数据库中查询出的所有数据,减少查询数据库的动作
c.高级需求:
listview的延时加载:
如果listview里面要显示的有很多的数据, 我们不需要一次把所有的数据都获取出来.
分段的方式 一段一段的把数据下载下来.
注册listview的 onScrollListener(); 发现最后一个可见的条目 为listview里面数据适配器里面的最后的一个条目, 加载更多的内容.
listview的分页显示:
服务器需要提供接口, 一次获取一段的数据.
数据库提供接口 ,一次查询一段的数据.
listview的快速拖动的问题:
当listview在滚动状态下,不去加载listview里面真实的图片和内容,而是把一个缩略图加载界面上.
当listview的滚动状态停止的时候 才去真正的更新里面的条目的内容.
如何让你的ListView实现自动滚动呢? Android其实已经考虑到ListView控件的智能滚动操作。直接在Layout中写即可,注意下面的stackFromBottom以及transcriptMode这两个属性。