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来在后台线程处理数据,再在UI线程更新ListView。本篇将详细介绍Android中如何利用ListView和AsyncTask实现数据的异步加载。 一、ListView简介 ...
本文将详细介绍如何在ListView中实现图片的异步加载,并且在用户拖动时不加载,以提高滚动流畅性。 一、异步加载原理 异步加载是指在后台线程中执行耗时操作,例如网络请求或解码图片,避免阻塞主线程。Android提供...
在Android应用开发中,异步加载图片是一项常见的需求,特别是在处理大数据量的图像时,如在GridView或ListView中展示图片。`AsyncTask`是Android提供的一种轻量级的多线程解决方案,它允许开发者在后台执行耗时操作...
然而,当ListView中的每个item都需要加载图片时,如果不采取异步加载策略,可能会导致应用性能下降,用户体验受到影响,因为主线程会因处理大量图片加载而变得卡顿。本教程将深入讲解如何在ListView中实现异步加载...
ListView异步加载图片,图片错位问题解决方案 * 问题分析:我们在使用AsyncTask异步下载图片的时候,经常会用到convertView的重用,一般情况下,滑动后第一个可见的元素(我们给它命个名,称为A1)和 * listview...
在实现异步加载ListView时,ASyncTask会在后台加载数据,然后在onPostExecute()中将数据传递给ListView。同时,我们还需要确保数据加载的顺序与用户滚动时看到的视图匹配,这通常通过Adapter的getView()方法实现。 ...
ListView是Android平台上常见的一种用于展示大量数据的视图组件,尤其在处理长列表时,它的异步加载机制显得尤为重要。异步加载是为了提高用户体验,避免因加载大量数据而导致UI线程阻塞,使得应用程序响应变慢甚至...
2. 实现异步加载:使用AsyncTask或其他异步框架(如Handler、Loader)来下载和解码图片。在后台线程中,先检查图片是否已存在于缓存中,如果存在,直接返回;否则,从网络下载图片并解码后存入缓存。 3. 图片加载回...
1. **异步处理**:在Android中,可以使用AsyncTask、Handler、Thread或第三方库如Glide、Picasso等实现异步加载。这些库能够自动处理线程切换,使图片加载工作在后台进行,加载完成后在UI线程更新视图。 2. **内存...
综上所述,中级水平的AsyncTask异步加载不仅涉及基本的后台数据处理,还包含了对数据加载顺序、UI更新策略、异常处理等多个方面的深入理解和实践。熟练掌握这些技能,能帮助开发者编写出高效、稳定的Android应用。
因此,"ListView 图片异步加载"是一个至关重要的优化策略,它的目标是非阻塞UI线程,确保用户在滑动ListView时能够得到流畅的体验。 异步加载图片的基本原理是将图片加载工作放在后台线程进行,避免占用主线程资源...
要实现异步加载图片,我们需要使用 Thread 或 AsyncTask 来加载图片。这里我们使用 Thread 来加载图片。在 loadDrawable 方法中,我们首先检查图片是否已经加载,如果已经加载,则直接返回缓存的图片,如果没有加载...
本教程将重点讲解如何通过异步加载技术优化ListView,确保滚动流畅,提高用户体验。 一、Android ListView的基础知识 ListView是一个可以滚动的视图,通常用于显示大量的数据项,通过Adapter来连接数据源和视图。...
综上所述,"androidListView图片异步加载"涉及的知识点包括Android的异步编程模型(如AsyncTask)、图片缓存策略、ListView的优化以及图片加载库的使用。通过实践这个项目,初学者不仅可以掌握异步加载的原理,还能...
本文将深入探讨如何在ListView中实现异步加载网络图片,提升应用的性能和用户体验。 1. **异步加载原理**:异步加载的核心思想是将耗时的操作(如网络请求和图片解码)放到后台线程执行,而不是在主线程(UI线程)...
因此,"最终实现ListView的异步加载"这一主题至关重要,它涉及到如何有效地处理大数据集,提升应用性能,同时保证用户界面的流畅性。 异步加载(Async Loading)是一种解决此问题的策略,它将数据分批加载,只在...
为了解决这个问题,我们需要实现ListView的图片异步加载。本文将深入探讨Android ListView中异步加载图片的策略、常见问题以及解决方案。 首先,我们要理解异步加载的基本原理。异步加载是指在后台线程中执行耗时...
为了提升用户体验,我们需要实现ListView的异步加载,图片的本地缓存,以及手势识别功能。 1. **异步加载**: 异步加载是指在后台线程中加载数据,避免阻塞主线程,从而保证UI的流畅性。对于ListView,我们可以...