接着上篇博客的项目,继续对ListView进行优化。如果ListView 的Item非常复杂,需要加载数据比较多,那么我们在快速滑动时会出现卡顿现象。所以,我们优化ListView,监听ListView的滑动,在ListView滑动时,不加载任何数据,只有滑动停止时才加载手机屏幕内可见的数据,其他地方不加载
个人思路:
1.首先NewAdapter实现 onScrollListener 接口,重写 onScroll和onScrollStateChanged方法。onScroll方法可以提供当滑动停止时ListView中需要加载图片的起始位置(start)和结束(end)位置(当然程序首次启动时,也需要在onScroll中预加载图片)。然后,start—end之间加载图片的url如何获取?答:将List<NewsBean> 中每个数据所对应的picUrl取出来放在一个list.size()大小的静态数组URLS中,之后再从URLS中取出start--end之间的url。那么onScrollStateChanged中,当滑动停止时加载从start到end之间的图片(loadImages(start,end)),否则取消全部的异步加载任务.
2.接下来具体实现loadImages(start ,end )方法:先获得从start到end之间的url,然后根据url获得Bitmap 并判断是否在缓存中存在,如果bitmap不存在,则启动异步任务下载,并将此任务添加到异步任务的集合中。如果存在,则直接设置(但是,不是设置imageView,此处已经作为一个从start到end的整体来进行设置,即需要一个listview,然后根据listView的findViewWithTag(url)来获得listView中url对应的ImageView)
3.取消所有任务:for(NewsAsyncTask task: mTask){
task.cacel(false);
}
4.首次启动预加载 boolean isFirstIn; 在初始化的构造方法中将isFirstIn设置为true,然后在onScroll中加载完一屏,之后将isFirs