Android ListView 优化最佳实践
jopen
10年前
我有篇博客教大家如何利用 convertView 以及 viewHolder(static) 改善 ListView 卡顿情况;但是在 ListView 加载大量复杂布局和图片的时候,即使使用了 convertView 和 viewHolder,ListView还是卡顿,本文主要讨论了如何在加载复杂 list_item 同时保证 ListView 流畅性。
核心思想是
监听滑动据加载,异步加载数据。
getView 函数一定不能耗时,有耗时任务要异步加载。
主要的方法:
-
先判断当前 ListView 的状态,只有 ListView 停止滑动才开启新线程加载数据,其他状态均忽略。
-
使用 getFirstVisiblePosition 和 getLastVisiblePosition 方法来显示 item。
-
耗时任务一定不要在 getView 方法中进行,最好异步进行。
具体代码如下:
1 //1. 判断listView状态 2 AbsListView.OnScrollListener onScrollListener = new AbsListView.OnScrollListener() {// ListView 3 // 触摸事件 4 5 public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { 6 } 7 8 public void onScrollStateChanged(AbsListView view, int scrollState) { 9 switch (scrollState) { 10 case AbsListView.OnScrollListener.SCROLL_STATE_FLING:// 滑动状态 11 threadFlag = false; 12 break; 13 case AbsListView.OnScrollListener.SCROLL_STATE_IDLE:// 停止 14 threadFlag = true; 15 startThread();//开启新线程,加载数据 16 break; 17 case AbsListView.OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:// 触摸listView 18 threadFlag = false; 19 break; 20 default: 21 // Toast.makeText(contextt, "default", 22 // Toast.LENGTH_SHORT).show(); 23 break; 24 } 25 } 26 };
相信做到以上三点,就能运用自如的使用 ListView了,O(∩_∩)O哈哈~
来自:http://stackvoid.com/list-view-optimization-best-practice-android/