Android ListView只加载当前屏幕内的图片(解决list滑动时加载卡顿)

简介:

最近在做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;
				}
			}
		});

/**
	 * 只加载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);
				}
			}
		});
	}

@Override  
    public void handleMessage(Message msg) {  
        switch (msg.arg1) {  
        case Constant.MSG_LIST_IMG_OK:  
            // 更新UI  
            adapter.notifyDataSetChanged();  
            break;  
        }  
        super.handleMessage(msg);  
    }  
};  

上个图吧:



相关文章
|
7月前
|
Java Android开发 UED
🧠Android多线程与异步编程实战!告别卡顿,让应用响应如丝般顺滑!🧵
【7月更文挑战第28天】在Android开发中,确保UI流畅性至关重要。多线程与异步编程技术可将耗时操作移至后台,避免阻塞主线程。我们通常采用`Thread`类、`Handler`与`Looper`、`AsyncTask`及`ExecutorService`等进行多线程编程。
76 2
|
9月前
|
开发工具 Android开发
rk平台Android12屏幕永不休眠
rk平台Android12屏幕永不休眠
155 1
|
5月前
|
编解码 开发工具 Android开发
Android平台实现屏幕录制(屏幕投影)|音频播放采集|麦克风采集并推送RTMP或轻量级RTSP服务
Android平台屏幕采集、音频播放声音采集、麦克风采集编码打包推送到RTMP和轻量级RTSP服务的相关技术实现,做成高稳定低延迟的同屏系统,还需要有配套好的RTMP、RTSP直播播放器
|
8月前
|
API Android开发 开发者
`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView
【6月更文挑战第26天】`RecyclerView`是Android API 21引入的UI组件,用于替代ListView和GridView。它提供高效的数据视图复用,优化的布局管理,支持多种布局(如线性、网格),并解耦数据、适配器和视图。RecyclerView的灵活性、性能(如局部刷新和动画支持)和扩展性使其成为现代Android开发的首选,特别是在处理大规模数据集时。
98 2
|
8月前
|
XML 监控 安全
Android App性能优化之卡顿监控和卡顿优化
本文探讨了Android应用的卡顿优化,重点在于布局优化。建议包括将耗时操作移到后台、使用ViewPager2实现懒加载、减少布局嵌套并利用merge标签、使用ViewStub减少资源消耗,以及通过Layout Inspector和GPU过度绘制检测来优化。推荐使用AsyncLayoutInflater异步加载布局,但需注意线程安全和不支持特性。卡顿监控方面,提到了通过Looper、ChoreographerHelper、adb命令及第三方工具如systrace和BlockCanary。总结了Choreographer基于掉帧计算和BlockCanary基于Looper监控的原理。
143 3
|
8月前
|
前端开发 API Android开发
25. 【Android教程】列表控件 ListView
25. 【Android教程】列表控件 ListView
286 2
|
9月前
|
Shell Android开发
ADB更改Android设备屏幕显示方向
ADB更改Android设备屏幕显示方向
429 5
|
9月前
|
Android开发
获取Android设备屏幕大小
获取Android设备屏幕大小
156 3
|
9月前
|
XML Java Android开发
如何美化android程序:自定义ListView背景
如何美化android程序:自定义ListView背景
85 2
|
9月前
|
存储 Android开发
Android 解决USB TP驱动中触摸卡顿和防抖动问题
Android 解决USB TP驱动中触摸卡顿和防抖动问题
249 1

热门文章

最新文章

  • 1
    如何修复 Android 和 Windows 不支持视频编解码器的问题?
  • 2
    【08】flutter完成屏幕适配-重建Android,增加GetX路由,屏幕适配,基础导航栏-多版本SDK以及gradle造成的关于fvm的使用(flutter version manage)-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 3
    当flutter react native 等混开框架-并且用vscode-idea等编译器无法打包apk,打包安卓不成功怎么办-直接用android studio如何打包安卓apk -重要-优雅草卓伊凡
  • 4
    【04】flutter补打包流程的签名过程-APP安卓调试配置-结构化项目目录-完善注册相关页面-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程
  • 5
    APP-国内主流安卓商店-应用市场-鸿蒙商店上架之必备前提·全国公安安全信息评估报告如何申请-需要安全评估报告的资料是哪些-优雅草卓伊凡全程操作
  • 6
    【02】写一个注册页面以及配置打包选项打包安卓apk测试—开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草央千澈
  • 7
    Android经典面试题之Kotlin中Lambda表达式和匿名函数的区别
  • 8
    【09】flutter首页进行了完善-采用android studio 进行真机调试开发-增加了直播间列表和短视频人物列表-增加了用户中心-卓伊凡换人优雅草Alex-开发完整的社交APP-前端客户端开发+数据联调|以优雅草商业项目为例做开发-flutter开发-全流程-商业应用级实战开发-优雅草Alex
  • 9
    【Azure Blob】操作Blob之分页List Blob一致性、索引时延及Tag支持问题解答
  • 10
    android之ListView和SimpleAdapter的组合使用