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/

- 大小: 68.2 KB
分享到:
相关推荐
1. 视频加载问题:当ListView滚动时,需要确保视频只在其可见时加载和播放,滚动离开后则停止加载和播放,以节省资源。 2. 生命周期管理:ListView中的每个单元格(ViewHolder)需要正确处理TextureView的创建、初始...
python学习资源
jfinal-undertow 用于开发、部署由 jfinal 开发的 web 项目
基于Andorid的音乐播放器项目设计(国外开源)实现源码,主要针对计算机相关专业的正在做毕设的学生和需要项目实战练习的学习者,也可作为课程设计、期末大作业。
python学习资源
python学习资源
python学习一些项目和资源
【毕业设计】java-springboot+vue家具销售平台实现源码(完整前后端+mysql+说明文档+LunW).zip
HTML+CSS+JavaScarip开发的前端网页源代码
python学习资源
【毕业设计】java-springboot-vue健身房信息管理系统源码(完整前后端+mysql+说明文档+LunW).zip
成绩管理系统C/Go。大学生期末小作业,指针实现,C语言版本(ANSI C)和Go语言版本
1_基于大数据的智能菜品个性化推荐与点餐系统的设计与实现.docx
【毕业设计】java-springboot-vue交流互动平台实现源码(完整前后端+mysql+说明文档+LunW).zip
内容概要:本文主要探讨了在高并发情况下如何设计并优化火车票秒杀系统,确保系统的高性能与稳定性。通过对比分析三种库存管理模式(下单减库存、支付减库存、预扣库存),强调了预扣库存结合本地缓存及远程Redis统一库存的优势,同时介绍了如何利用Nginx的加权轮询策略、MQ消息队列异步处理等方式降低系统压力,保障交易完整性和数据一致性,防止超卖现象。 适用人群:具有一定互联网应用开发经验的研发人员和技术管理人员。 使用场景及目标:适用于电商、票务等行业需要处理大量瞬时并发请求的业务场景。其目标在于通过合理的架构规划,实现在高峰期保持平台的稳定运行,保证用户体验的同时最大化销售额。 其他说明:文中提及的技术细节如Epoll I/O多路复用模型以及分布式系统中的容错措施等内容,对于深入理解大规模并发系统的构建有着重要指导意义。
基于 OpenCV 和 PyTorch 的深度车牌识别
【毕业设计-java】springboot-vue教学资料管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip
此数据集包含有关出租车行程的详细信息,包括乘客人数、行程距离、付款类型、车费金额和行程时长。它可用于各种数据分析和机器学习应用程序,例如票价预测和乘车模式分析。
把代码放到Word中,通过开发工具——Visual Basic——插入模块,粘贴在里在,把在硅基流动中申请的API放到VBA代码中。在Word中,选择一个问题,运行这个DeepSeekV3的宏就可以实现在线问答
【毕业设计】java-springboot+vue机动车号牌管理系统实现源码(完整前后端+mysql+说明文档+LunW).zip