`

ListView,AsyncTask异步加载

 
阅读更多

ListView结合getView来显示数据的时候,可能每一个listItem都需要后台进行大量的耗时处理,比如从网络下载,或者计算得出结果等等。这时候如果用户滚动ListView就会得到不好的用户体验,会很卡。

 

可以这样解决这个问题:

 

当用户滚动屏幕的时候,监听listview滚动onScroll()和停止滚动的事件onScrollStateChanged()。

 

每次滚动的时候触发onScroll(),在onScroll()中获得firstVisibleItem和visibleItemCount。保存起来。

 

当用户停止滚动的时候,触发onScrollStateChanged(),这时候将获得的firstVisibleItem和visibleItemCount传递给自定义的一个接口方法scrollTo()。

 

在scrollTo()中开启一个AsyncTask线程。通过这个线程来实现后台数据的加载

 

Activity:

class LvOfCallLogsScrollListener implements OnScrollListener {

		private int firstVisibleItem;
		private int visibleItemCount;

		public void onScrollStateChanged(AbsListView view, int scrollState) {
			System.out.println("---------onScrollStateChanged---------"
					+ scrollState + " ==" + OnScrollListener.SCROLL_STATE_IDLE
					+ "firstVisibleItem" + firstVisibleItem
					+ "visibleItemCount:" + visibleItemCount);
			if (popWindowOfKeyboard.isShowing()) {
				popWindowOfKeyboard.dismiss();

				sendBroadcastToMain(KEYBOARD_CLOSED);
			}
			if (myPopupWindowOfCallLogSort.isShowing()) {
				myPopupWindowOfCallLogSort.dismiss();
			}
			if (scrollState == OnScrollListener.SCROLL_STATE_IDLE)
				if (view.getAdapter() instanceof GenerateItemView) {
					((GenerateItemView) view.getAdapter()).scrollTo(
							firstVisibleItem, visibleItemCount);
				}

		}

		public void onScroll(AbsListView view, int firstVisibleItem,
				int visibleItemCount, int totalItemCount) {
			// System.out.println("---------onScroll---------");
			this.firstVisibleItem = firstVisibleItem;
			this.visibleItemCount = visibleItemCount;
			if(firstVisibleItem==0)
			{
				if (view.getAdapter() instanceof GenerateItemView) {
					((GenerateItemView) view.getAdapter()).scrollTo(
							firstVisibleItem, visibleItemCount);
				}
			}

		}

	}

 

BaseAdapter:

/** 
	 * 
	 * @param firsP
	 * @param lasp
	 */
	public  void scrollTo(int firsP,int lasp)
	{
		
		loadRunnable=new LoadRunnable(firsP,lasp);
		
		loadRunnable.execute(null);
		
		
	}
	
	 
	private class LoadRunnable extends AsyncTask {

		private int first;
		private int visible;
		public LoadRunnable(int firsP,int visible)
		{
			first=firsP;
			this.visible=visible;
		}
		 
		@Override
		protected void onPostExecute(Object result) {
			//.....
			 notifyDataSetChanged();
		}

		@Override
		protected Object doInBackground(Object... params) {
			//.....耗时操作
			for(int i=0;i<visible;i++)
				listOfPersonList.get(i+first).get(0).setTelLocation("fuzhou");
			return null;
		}
		
		
		
	};

 

但是这样做有一个不好的地方,当用户一直滚动的时候,会出现明显的加载数据延时。因为没有把无效滚动的消息忽略掉。

 

 

 

分享到:
评论

相关推荐

    安卓图片加载缓存相关-AsyncTask的使用及ListView的常见优化asyncTask异步加载数据使用了LruCache优化图片加载通过滑动监听提高ListView滑动流畅度.rar

    AsyncTask的使用及ListView的常见优化 asyncTask异步加载数据 使用了LruCache优化图片加载 通过滑动监听提高ListView滑动流畅度.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习...

    Android中使用ListView数据异步加载与AsyncTask

    为了解决这个问题,开发者通常会采用数据异步加载策略,结合AsyncTask来在后台线程处理数据,再在UI线程更新ListView。本篇将详细介绍Android中如何利用ListView和AsyncTask实现数据的异步加载。 一、ListView简介 ...

    android listView图片异步加载(拖动时不加载,双缓存)

    本文将详细介绍如何在ListView中实现图片的异步加载,并且在用户拖动时不加载,以提高滚动流畅性。 一、异步加载原理 异步加载是指在后台线程中执行耗时操作,例如网络请求或解码图片,避免阻塞主线程。Android提供...

    Android用AsyncTask异步加载图片(新)

    在Android应用开发中,异步加载图片是一项常见的需求,特别是在处理大数据量的图像时,如在GridView或ListView中展示图片。`AsyncTask`是Android提供的一种轻量级的多线程解决方案,它允许开发者在后台执行耗时操作...

    listview item 异步加载数据图片

    然而,当ListView中的每个item都需要加载图片时,如果不采取异步加载策略,可能会导致应用性能下降,用户体验受到影响,因为主线程会因处理大量图片加载而变得卡顿。本教程将深入讲解如何在ListView中实现异步加载...

    listview 图片异步加载 图片错位 软引用 getView调用次数 convertView重用

    ListView异步加载图片,图片错位问题解决方案 * 问题分析:我们在使用AsyncTask异步下载图片的时候,经常会用到convertView的重用,一般情况下,滑动后第一个可见的元素(我们给它命个名,称为A1)和 * listview...

    Asynctask异步加载带图的listview,加入lru缓存机制

    在实现异步加载ListView时,ASyncTask会在后台加载数据,然后在onPostExecute()中将数据传递给ListView。同时,我们还需要确保数据加载的顺序与用户滚动时看到的视图匹配,这通常通过Adapter的getView()方法实现。 ...

    listview异步加载.rar

    ListView是Android平台上常见的一种用于展示大量数据的视图组件,尤其在处理长列表时,它的异步加载机制显得尤为重要。异步加载是为了提高用户体验,避免因加载大量数据而导致UI线程阻塞,使得应用程序响应变慢甚至...

    ListView异步加载图片

    2. 实现异步加载:使用AsyncTask或其他异步框架(如Handler、Loader)来下载和解码图片。在后台线程中,先检查图片是否已存在于缓存中,如果存在,直接返回;否则,从网络下载图片并解码后存入缓存。 3. 图片加载回...

    ListView的异步加载图片并缓存

    1. **异步处理**:在Android中,可以使用AsyncTask、Handler、Thread或第三方库如Glide、Picasso等实现异步加载。这些库能够自动处理线程切换,使图片加载工作在后台进行,加载完成后在UI线程更新视图。 2. **内存...

    AsyncTask异步加载(中级)

    综上所述,中级水平的AsyncTask异步加载不仅涉及基本的后台数据处理,还包含了对数据加载顺序、UI更新策略、异常处理等多个方面的深入理解和实践。熟练掌握这些技能,能帮助开发者编写出高效、稳定的Android应用。

    ListView 图片异步加载

    因此,"ListView 图片异步加载"是一个至关重要的优化策略,它的目标是非阻塞UI线程,确保用户在滑动ListView时能够得到流畅的体验。 异步加载图片的基本原理是将图片加载工作放在后台线程进行,避免占用主线程资源...

    Android实现ListView异步加载图片

    要实现异步加载图片,我们需要使用 Thread 或 AsyncTask 来加载图片。这里我们使用 Thread 来加载图片。在 loadDrawable 方法中,我们首先检查图片是否已经加载,如果已经加载,则直接返回缓存的图片,如果没有加载...

    Android ListView优化 异步加载图片

    本教程将重点讲解如何通过异步加载技术优化ListView,确保滚动流畅,提高用户体验。 一、Android ListView的基础知识 ListView是一个可以滚动的视图,通常用于显示大量的数据项,通过Adapter来连接数据源和视图。...

    androidListView图片异步加载

    综上所述,"androidListView图片异步加载"涉及的知识点包括Android的异步编程模型(如AsyncTask)、图片缓存策略、ListView的优化以及图片加载库的使用。通过实践这个项目,初学者不仅可以掌握异步加载的原理,还能...

    listview 异步加载网络图片

    本文将深入探讨如何在ListView中实现异步加载网络图片,提升应用的性能和用户体验。 1. **异步加载原理**:异步加载的核心思想是将耗时的操作(如网络请求和图片解码)放到后台线程执行,而不是在主线程(UI线程)...

    最终实现ListView的异步加载

    因此,"最终实现ListView的异步加载"这一主题至关重要,它涉及到如何有效地处理大数据集,提升应用性能,同时保证用户界面的流畅性。 异步加载(Async Loading)是一种解决此问题的策略,它将数据分批加载,只在...

    Android Listview异步加载图片

    为了解决这个问题,我们需要实现ListView的图片异步加载。本文将深入探讨Android ListView中异步加载图片的策略、常见问题以及解决方案。 首先,我们要理解异步加载的基本原理。异步加载是指在后台线程中执行耗时...

    实现ListView的异步加载,图片的本地缓存,以及手势识别

    为了提升用户体验,我们需要实现ListView的异步加载,图片的本地缓存,以及手势识别功能。 1. **异步加载**: 异步加载是指在后台线程中加载数据,避免阻塞主线程,从而保证UI的流畅性。对于ListView,我们可以...

Global site tag (gtag.js) - Google Analytics