我有篇博客教大家如何利用 convertView 以及 viewHolder(static) 改善 ListView 卡顿情况;但是在 ListView 加载大量复杂布局和图片的时候,即使使用了 convertView 和 viewHolder,ListView还是卡顿,本文主要讨论了如何在加载复杂 list_item 同时保证 ListView 流畅性。

核心思想是

监听滑动据加载,异步加载数据。

getView 函数一定不能耗时,有耗时任务要异步加载。

主要的方法:

  1. 先判断当前 ListView 的状态,只有 ListView 停止滑动才开启新线程加载数据,其他状态均忽略。

  2. 使用 getFirstVisiblePosition 和 getLastVisiblePosition 方法来显示 item。

  3. 耗时任务一定不要在 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这两个属性。