【BUG解决】Android ListView只加载目前屏幕内的图片(解决list滑动时加载卡顿)
【BUG解决】Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)
判断下adapter==null时加载
判断下adapter==null时加载
还是不明白,能说详细点吗?
判断下adapter==null时加载
还是不明白,能说详细点吗?
可以这样做,在getView中添加一个布尔值,如果布尔值是true,那么启动下载,当listview开始滑动的时候,把这个布尔值变为false这样就不会在getView中继续下载了,也就达到了效果
判断下adapter==null时加载
还是不明白,能说详细点吗?
可以这样做,在getView中添加一个布尔值,如果布尔值是true,那么启动下载,当listview开始滑动的时候,把这个布尔值变为false这样就不会在getView中继续下载了,也就达到了效果
这样会有一个问题,getview只在初始化时调用,所以是瞬时的,而下载是持续的(单独的线程),getview里加个开关不能完全控制新的线程!除非锁住线程
http://androiddada.iteye.com/
最近在做ListView分页显示,其中包括图片 和文字(先下载解析文字内容,再异步加载图片)发现每次点击下一页后,文字内容加载完毕,马上向下滑动,由于这时后台在用线程池异步下载图片,我每页有20条,也就是20张图片,会导致listview滑动卡顿!
这是用户不想看到的,我参考了网易新闻和电子市场等应用,发现它们都是只加载屏幕内的图片,不现实的不加载,于是我也仿照做了一个。我是菜鸟,我承认 呵呵,虽然不见得完全和他们的一样,但是确实解决了翻页时那一刻的卡顿现象。
因为未发现网上有相关文章,希望对朋友们有用~
下面是相关代码(分页的就没放):
/** * list滚动监听 */ listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub // 异步加载图片 if (scrollState == OnScrollListener.SCROLL_STATE_IDLE) {//list停止滚动时加载图片 pageImgLoad(_start_index, _end_index); } } @Override public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { // TODO Auto-generated method stub //设置当前屏幕显示的起始index和结束index _start_index = firstVisibleItem; _end_index = firstVisibleItem + visibleItemCount; if (_end_index >= totalItemCount) { _end_index = totalItemCount - 1; } } });
http://androiddada.iteye.com/
/** * 只加载from start_index to end_index 的图片 * @param start_index * @param end_index */ private void pageImgLoad(int start_index, int end_index) { for (; start_index < end_index; start_index++) { HashMap<String, Object> curr_item = adapter.getItem(start_index); if (curr_item.get(Constant.NEWS_ICON_URL) != null && curr_item.get(Constant.NEWS_ICON) == null) { loadImage(curr_item); } } }
异步加载图片代码,这里我之前使用的是AsyncTask,但是继承AsyncTask后不能被执行多次,所以我改用了线程呼叫handler更新UI:
/** * 异步加载图片 * @param curr_item */ private void loadImage(final HashMap<String, Object> curr_item) { executorService.submit(new Runnable() { public void run() { try { Drawable curr_icon = null; String icon_URL = (String) curr_item .get(Constant.NEWS_ICON_URL); String newsId = (String) curr_item.get(Constant.NEWS_ID); if (imageCache.containsKey(icon_URL)) {//软引用 SoftReference<Drawable> softReference = imageCache .get(icon_URL); curr_icon = softReference.get(); System.out.println("CASE USING SoftReference!!!!!!!!!!!!!!!!!!!!"); } if (curr_icon == null) { HttpUtils hu = new HttpUtils(); FileUtils fu = new FileUtils(); if (hu.is_Intent(Home_Activity.this)) { fu.write2LocalFromIS(Home_Activity.this, newsId + Constant.SAVE_NEWS_ICON_NAME + Constant.SAVE_IMG_SUFFIX, hu.getISFromURL(icon_URL)); } // 从本地加载图片 如果没网则直接加载本地图片 curr_icon = fu.readDrawableFromLocal( Home_Activity.this, newsId + Constant.SAVE_NEWS_ICON_NAME + Constant.SAVE_IMG_SUFFIX); imageCache.put(icon_URL, new SoftReference<Drawable>( curr_icon)); } curr_item.put(Constant.NEWS_ICON, curr_icon); // UI交给handler更新 Message msg = _viewHandler.obtainMessage(); msg.arg1 = Constant.MSG_LIST_IMG_OK; msg.sendToTarget(); } catch (Exception e) { throw new RuntimeException(e); } } }); }
handler代码:
Handler _viewHandler = new Handler() {
@Override public void handleMessage(Message msg) { switch (msg.arg1) { case Constant.MSG_LIST_IMG_OK: // 更新UI adapter.notifyDataSetChanged(); break; } super.handleMessage(msg); } };
上个图吧:
http://androiddada.iteye.com/
1 楼
zhongxinhu
2011-11-07
学习一下!
2 楼
xh416563137
2011-11-29
LZ能发一份源码给我么?邮箱 416563137@qq.com
非常感谢!!!
非常感谢!!!
3 楼
reeceran
2012-04-16
问你个问题,当刚进去的时候,没有滑动,onScrollStateChanged函数不会调用,图片也不会下载,这个怎么解决?
4 楼
libo19881179
2012-04-17
reeceran 写道
问你个问题,当刚进去的时候,没有滑动,onScrollStateChanged函数不会调用,图片也不会下载,这个怎么解决?
判断下adapter==null时加载
5 楼
reeceran
2012-04-19
libo19881179 写道
reeceran 写道
问你个问题,当刚进去的时候,没有滑动,onScrollStateChanged函数不会调用,图片也不会下载,这个怎么解决?
判断下adapter==null时加载
还是不明白,能说详细点吗?
6 楼
zingsky
2012-06-20
楼主有项目么,还不清楚下载完成后如何更新UI
7 楼
zingsky
2012-06-25
reeceran 写道
libo19881179 写道
reeceran 写道
问你个问题,当刚进去的时候,没有滑动,onScrollStateChanged函数不会调用,图片也不会下载,这个怎么解决?
判断下adapter==null时加载
还是不明白,能说详细点吗?
可以这样做,在getView中添加一个布尔值,如果布尔值是true,那么启动下载,当listview开始滑动的时候,把这个布尔值变为false这样就不会在getView中继续下载了,也就达到了效果
8 楼
libo19881179
2012-06-25
zingsky 写道
reeceran 写道
libo19881179 写道
reeceran 写道
问你个问题,当刚进去的时候,没有滑动,onScrollStateChanged函数不会调用,图片也不会下载,这个怎么解决?
判断下adapter==null时加载
还是不明白,能说详细点吗?
可以这样做,在getView中添加一个布尔值,如果布尔值是true,那么启动下载,当listview开始滑动的时候,把这个布尔值变为false这样就不会在getView中继续下载了,也就达到了效果
这样会有一个问题,getview只在初始化时调用,所以是瞬时的,而下载是持续的(单独的线程),getview里加个开关不能完全控制新的线程!除非锁住线程