前些天写了一篇 关于
ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)的文章:
这几天测试时发现了些可以改进的地方。
之前的方法确实能很有效的解决 :listview加载下一页时 因为图片较多异步加载的卡顿问题。
但是,发现在用手拖动ListView的时候,滚动出的item中的图片是不加载的。
原因是在onScrollStateChanged方法中监听,只能监听滚动状态的改变(拖动时它只执行一次),而在用手一直拖动时,系统是不回调onScrollStateChanged方法的,其中加载图片的方法自然是不会执行的!
为了让拖动列表时显示出来的item也加载图片,所以我添加了setOnTouchListener监听,便可完美解决这个问题:
-
-
-
-
_listView.setOnTouchListener(newOnTouchListener(){
-
@Override
-
publicbooleanonTouch(Viewv,MotionEventevent){
-
-
if(event.getAction()==MotionEvent.ACTION_MOVE&&_scrollState!=OnScrollListener.SCROLL_STATE_FLING){
-
-
}
-
returnfalse;
-
}
-
});
要注意的是
当你的onTouchListener返回true时,那么touch事件就被拦截了,代表你自己处理了。onListItemClick变不会执行!!
返回false的话,就不会影响。
|
参加:
最近在做ListView分页显示,其中包括图片 和文字(先下载解析文字内容,再异步加载图片)发现每次点击下一页后,文字内容加载完毕,马上向下滑动,由于这时后台在用线程池异步下载图片,我每页有20条,也就是20张图片,会导致listview滑动卡顿!
这是用户不想看到的,我参考了网易新闻和电子市场等应用,发现它们都是只加载屏幕内的图片,不现实的不加载,于是我也仿照做了一个。我是菜鸟,我承认 呵呵,虽然不见得完全和他们的一样,但是确实解决了翻页时那一刻的卡顿现象。
因为未发现网上有相关文章,希望对朋友们有用~
下面是相关代码(分页的就没放):
-
-
-
-
listView.setOnScrollListener(newOnScrollListener(){
-
@Override
-
publicvoidonScrollStateChanged(AbsListViewview,intscrollState){
-
-
-
if(scrollState==OnScrollListener.SCROLL_STATE_IDLE){
-
pageImgLoad(_start_index,_end_index);
-
}
-
}
-
@Override
-
publicvoidonScroll(AbsListViewview,intfirstVisibleItem,
-
intvisibleItemCount,inttotalItemCount){
-
-
-
_start_index=firstVisibleItem;
-
_end_index=firstVisibleItem+visibleItemCount;
-
if(_end_index>=totalItemCount){
-
_end_index=totalItemCount-1;
-
}
-
}
-
});
-
-
-
-
-
-
privatevoidpageImgLoad(intstart_index,intend_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:
-
-
-
-
-
privatevoidloadImage(finalHashMap<String,Object>curr_item){
-
executorService.submit(newRunnable(){
-
publicvoidrun(){
-
try{
-
Drawablecurr_icon=null;
-
Stringicon_URL=(String)curr_item
-
.get(Constant.NEWS_ICON_URL);
-
StringnewsId=(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("CASEUSINGSoftReference!!!!!!!!!!!!!!!!!!!!");
-
}
-
if(curr_icon==null){
-
HttpUtilshu=newHttpUtils();
-
FileUtilsfu=newFileUtils();
-
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,newSoftReference<Drawable>(
-
curr_icon));
-
}
-
curr_item.put(Constant.NEWS_ICON,curr_icon);
-
-
Messagemsg=_viewHandler.obtainMessage();
-
msg.arg1=Constant.MSG_LIST_IMG_OK;
-
msg.sendToTarget();
-
}catch(Exceptione){
-
thrownewRuntimeException(e);
-
}
-
}
-
});
-
}
-
Handler_viewHandler=newHandler(){
-
@Override
-
publicvoidhandleMessage(Messagemsg){
-
switch(msg.arg1){
-
caseConstant.MSG_LIST_IMG_OK:
-
-
adapter.notifyDataSetChanged();
-
break;
-
}
-
super.handleMessage(msg);
-
}
-
};
上个图吧:
分享到:
相关推荐
①ListView异步加载图片的方式 ②给ImageView设置Tag,解决图片覆盖问题 ③采用LruCache缓存已经加载过的图片 ④当ListView滚动时不加载图片,滚动停止时才加载...⑤当ListView加载图片时只加载当前屏幕内可见的条目
我们在使用ListView时 用户时长会 连续滚动...个人做了小demo 可以再ListView滚动结束后 只加载当前用户可视区的图片。减少堵塞情况。 http://blog.csdn.net/sunkeperfect/article/details/30044317 博客描述地址。
Android 实现ListView滚动到底部自动加载数据
1 已经成功实现对ListView滚动条的自定义,定义的效果和新浪微博,QQ微博...的效果一样。 2 实现了对ListView分批量加载数据,滑动到ListView底部的时候会自动加载数据。
ListView的数据滑动到底部时,会自动加载获取数据,然后把加载近来的新数据加载进ListView中。
C# WinForm ListView在虚拟模式下,从缓冲之中获取所需的数据进行加载,性能会有很大提高。步骤:(1)必须设置VirtualMode为true并设置VirtualListSize大小;(2)绑定该事件RetrieveVirtualItem(3)如果中间更新了数据...
android中listview数据分页加载功能实现
Android 实现ListView滚动到底部自动加载数据修正版
listview异步加载图片,滚动条滚动到地步自动调用后台异步加载数据
仿网易新闻APP的listview加载,滚动到底自动加载,下拉刷新,首次进入界面有下拉刷新功能
解决ListView滑动是卡的问题解决,实现异步加载图片,本地图片缓存,滚动手势识别
2. 将getView中需要加载的图片添加进堆栈,启动异步线程从栈顶开始加载图片,保证当前显示区域的图片被先显示。 3. 调整Load线程优先级为Thread.NORM_PRIORITY-1,不要和UI线程抢时间片,使滚动更流畅。 该代码用...
android中listview滚动加载的demo,通过监听事件实现滑动到底部自动加载更多数据
Android ListView异步加载图片,优化滚动效果,不卡顿、流畅显示。主要给新人了解ListView和AsyncTask、Json等使用。
此demo是我在其它网站看到的很好的例子,关于ListView分页加载实现,是滚动到底部加载新的,软缓存,懒加载,大家可以借鉴下,是实时加载的。
Android--ListView滚动到底部自动加载下页数据Demo
本文介绍了Android ListView 实现上拉加载... 当我们开始滚动时,Footer 布局才慢慢显示出来,所以需要监听 ListView 的 onTouch() 事件。 实现思路 首先判断 ListView 加载时机,当 ListView 的 lastVisibleItem == t
实现加载的数据一半左右滚动,所有的数据上下滚动
简单实现了分页滚动加载,附有注释。能看得懂。自己整理的。
效果不错的listview(带下拉刷新和加载更多,条目滚动带动画),效果很不错,值得一用,谁用谁知道