`

Android逐条加载ListView,实现动画更新

 
阅读更多
package com.Yao_GUET.test;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;
import android.widget.ListView;
/**
 * @author Yao.GUET
 * blog: http://blog.csdn.net/Yao_GUET
 * 实现动态加载一个ListView
 */
public class ProcessorBarTest extends Activity {
	public static final int MSG_UPDATE_LIST = 18;
	
	private ListView mApps;
	private Context mContext;
	private List<String> mAppList;
	private ProgressDialog dialog;
	private ArrayAdapter mAdapter;
	private boolean mIsLoaded = false;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.processorbar_test);
		
		// ListView 列表 mApps
		mApps = (ListView)findViewById(R.id.lvProcessbar);
		mContext = this;
		mAppList = new ArrayList<String>();
		mAdapter = new ArrayAdapter(mContext, 
				android.R.layout.simple_list_item_1, mAppList);
		mApps.setAdapter(mAdapter);
		
		// 设置正在处理窗口
		dialog = new ProgressDialog(mContext);
		dialog.setIcon(R.drawable.icon);
		dialog.setTitle("ProgressDialog");
		dialog.setMessage("Please wait while loading application list...");
		dialog.setCancelable(false);
		dialog.show();
		
		// 开始动态加载线程
		mThreadLoadApps.start();
		
		mApps.setOnItemClickListener(new AdapterView.OnItemClickListener(){
			public void onItemClick(AdapterView<?> parent, View v, int position,
					long id) {
				// TODO Auto-generated method stub
				mAppList.remove(position);
				mAdapter.notifyDataSetChanged();
			}
			
		});
		
		// 获取已经安装程序列表
		PackageManager pm = mContext.getPackageManager();
		Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
		mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
		List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);
		
		// 逐项添加程序,并发送消息更新ListView列表。
		for (int i=0; i<list.size(); i++) {
			mAppList.add(list.get(i).loadLabel(pm).toString());
			mAdapter.notifyDataSetChanged();
		}
		mIsLoaded = true;
	}
	
	private Thread mThreadLoadApps = new Thread(){
		@Override
		public void run() {
			int i = 0;
			// TODO Auto-generated method stub
			while (!mIsLoaded) {
				try {
					sleep(100);
				} catch (InterruptedException e) {
					e.printStackTrace();
				}
			}
			// 关闭正在处理窗口
			dialog.dismiss();
		}
		
	};
}
 

Android逐条加载ListView,实现动画更新

在Android应用中,如果ListView或是GridView里面的数据比较多的时候,加载会比较费时间,特别是里面有图片的时候,需要花费的时间就更长,这样就会出现一个长时间的等待黑屏界面,这样有时会给用户造成一种错觉,就是这个程序已经“死”了,,,

对于这个问题可以的一个方法是,添加一个ProgressDialog,显示正在处理的窗口,等待加载完之后再关闭这个窗口,

但是这样等所有的数据加载完之后,就是特别突然的显示, 这样用户体验也不佳,

以前看Android优化大师的时候,打开进程管理的时候,它是前面显示正在加载的ProgressDialog,然后也可以看到后台的数据正在逐条加载,这样给人的感觉就好很多,现在就是要做这个效果~~~~

主要实现的思路是这样的,新建一个线程,然后在线程里面获取已经安装的程序,再逐条把这些程序(数据)添加到缓冲数组中,再发送一个消息,更新显示ListView的内容,当线程中所有的数据已经加载完的时候,再把ProgressDialog关掉,总的完成效果如下:

程序源代码

package com.sf.test;
import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Context;
import android.content.Intent;
import android.content.pm.PackageManager;
import android.content.pm.ResolveInfo;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.view.KeyEvent;
import android.widget.ArrayAdapter;
import android.widget.ListView;
/**
 * @author Yao.GUET
 * blog: http://blog.csdn.net/Yao_GUET
 * 实现动态加载一个ListView
 */
public class ProcessorBarTest extends Activity {
	public static final int MSG_UPDATE_LIST = 18;
	
	private ListView mApps;
	private Context mContext;
	private List<String> mAppList;
	private ProgressDialog dialog;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);
		setContentView(R.layout.processorbar_test);
		
		// ListView 列表 mApps
		mApps = (ListView)findViewById(R.id.lvProcessbar);
		mContext = this;
		mAppList = new ArrayList<String>();
		
		// 设置正在处理窗口
		dialog = new ProgressDialog(mContext);
		dialog.setIcon(R.drawable.icon);
		dialog.setTitle("ProgressDialog");
		dialog.setMessage("Please wait while loading application list...");
		dialog.setCancelable(false);
		dialog.show();
		
		// 开始动态加载线程
		mThreadLoadApps.start();
	}
	
	private Thread mThreadLoadApps = new Thread(){
		@Override
		public void run() {
			int i = 0;
			// TODO Auto-generated method stub
			
			// 获取已经安装程序列表
			PackageManager pm = mContext.getPackageManager();
			Intent mainIntent = new Intent(Intent.ACTION_MAIN, null);
			mainIntent.addCategory(Intent.CATEGORY_LAUNCHER);
			List<ResolveInfo> list = pm.queryIntentActivities(mainIntent, 0);
			
			// 逐项添加程序,并发送消息更新ListView列表。
			for (i=0; i<list.size(); i++) {
				mAppList.add(list.get(i).loadLabel(pm).toString());
				handler.sendEmptyMessage(MSG_UPDATE_LIST);
			}
			// 关闭正在处理窗口
			dialog.dismiss();
		}
		
	};
	
	private Handler handler = new Handler(){
		@Override
		public void handleMessage(Message msg) {
			// TODO Auto-generated method stub
			switch (msg.what) {
			case MSG_UPDATE_LIST:
				// 更新应用程序列表
				mApps.setAdapter(new ArrayAdapter(mContext, 
						android.R.layout.simple_list_item_1, mAppList));
				break;
			}
			super.handleMessage(msg);
		}
	};
}
 

后面发现有效率更高的方法,其实不用每次更新一项都需要构建一个Adapter的,,,

把Adapter和一个List<?>绑定在一起之后,可以直接改变List<?>的内容,然后再使用Adapter的数据集更新通知,即可改变ListView的内容,所以后面改了一下源码变成这个样子,,,

 

 

分享到:
评论

相关推荐

    android动态加载Listview

    5. **更新Adapter**:加载到新的数据后,将数据添加到原有数据列表,然后调用`notifyDataSetChanged()`通知ListView数据已更新。 6. **优化性能**:在`getView()`方法中进行视图复用(ViewHolder模式),减少视图...

    Android 自定义ListView加载动画

    本篇将深入探讨如何为Android ListView实现四种不同的加载动画:左边飞入、旋转、从上飞入以及透明度变化。 首先,我们需要理解ListView的工作机制。ListView通过ViewHolder模式来提高性能,避免频繁的视图创建和...

    android动画实现ListView折叠展开

    3. **动画实现**:Android提供了多种动画库,如Animation和Animator,用于创建平滑的视觉效果。在这个场景下,我们可以使用TranslationAnimation或者ObjectAnimator来改变子项的高度,从而模拟折叠或展开的动作。...

    自定义ListView实现下拉刷新+加载更多功能Demo

    在Android开发中,自定义ListView实现下拉刷新和加载更多的功能是常见的需求,尤其是在构建具有数据流滚动和实时更新的应用程序时。这个"自定义ListView实现下拉刷新+加载更多功能Demo"旨在帮助开发者理解如何集成...

    Android ListView 下拉刷新、上拉加载

    `loadMoreData()`方法中,你需要实现加载新数据的逻辑,并在加载完成后更新ListView的数据源。最后,记得更新isLoadingMore变量为false,以便下次滚动时可以再次触发加载。 三、自定义ListView 在提供的`...

    android 自定义ListView实现动画特效

    因为ListView在滚动时会复用View,所以我们需要确保在onBindViewHolder或getView方法中正确地更新每个可见列表项的状态,以保持动画效果的连贯性。 在实际项目中,"horImageListView"可能表示这是一个包含横向滚动...

    android 下拉刷新 上拉加载 listview 实现demo

    4. **执行刷新逻辑**: 在接收到刷新请求后,执行后台数据加载任务,完成后更新`Adapter`的数据并调用`ListView#onRefreshComplete()`来停止刷新动画。 **上拉加载更多**(Load More)功能则是在用户滚动到列表底部...

    Android 实现ListView滚动到底部自动加载数据

    总之,实现Android ListView滚动到底部自动加载数据涉及到的主要步骤包括:设置适配器、监听滚动事件、判断是否滚动到底部、加载新数据和更新列表。这个过程需要对Android的基础组件和数据操作有深入的理解,同时也...

    android listview嵌套listview实现折叠列表

    本文将详细介绍如何在Android中使用ListView实现嵌套的可折叠效果。 首先,我们需要了解基本的ListView工作原理。ListView通过Adapter来绑定数据源,Adapter负责将数据转化为ListView可显示的View。在Android中,...

    Android ListView 实现上拉加载的示例代码

    以下是一个关于如何在Android中实现ListView上拉加载的详细步骤: 1. **判断加载时机**: 在实现上拉加载时,我们需要监听ListView的滚动事件。通过设置OnScrollListener,当ListView的lastVisibleItem等于...

    Android应用源码ListView 实现点击侧边A-Z快速查找.zip

    在Android应用开发中,ListView是常用的视图组件,它允许我们展示大量的数据并进行滚动操作。这个压缩包“Android应用源码ListView 实现点击侧边A-Z快速查找”提供了实现了一个功能,即通过点击侧边的字母栏快速定位...

    Android ViewPager实现画廊效果ListView Item添加动画集合

    在Android开发中,创建引人入胜的用户体验是至关重要的,而`ViewPager`和`ListView`结合使用可以实现丰富的交互式界面。`ViewPager`通常用于实现页面滑动效果,类似于画廊中的图片浏览,而`ListView`则常用于展示可...

    android的listview嵌套listview,列表嵌套列表 android studio版本

    总结来说,实现Android的ListView嵌套ListView需要理解ListView的工作机制,创建并管理两个Adapter,以及在布局文件中正确地嵌套ListView。这虽然不是特别高深的技术,但却是Android开发中常见的需求,熟练掌握能...

    listview实现动态加载

    在Android开发中,ListView是一...综上,"ListView实现动态加载"涵盖了Android开发中的数据适配、视图复用、异步加载、滚动监听、内存优化等多个重要知识点。熟练掌握这些技巧,对于构建流畅、高效的列表界面至关重要。

    Android实现ListView异步加载图片

    "Android实现ListView异步加载图片" Android 实现 ListView 异步加载图片是一种常见的技术,旨在提高应用程序的性能和用户体验。本文将详细介绍 Android 中实现 ListView 异步加载图片的方法,并对相关的技术概念...

    android studio实现listview的增加,左滑删除

    在本文中,我们将深入探讨如何在Android Studio中实现ListView的动态增加以及左滑删除功能,这将帮助你构建更加用户友好的应用程序。 首先,我们需要创建一个ListView的基础结构。在Android Studio中,打开布局XML...

    Android之ListView列表视图和界面跳转实现

    在Android开发中,ListView是一种非常常见的控件,用于展示大量数据的列表形式。它具有高度可定制性,能够实现各种自定义布局和交互效果。本教程将深入讲解如何实现一个基本的ListView,并在用户点击列表项时跳转到...

    android listview加载item动画

    Android listview动画效果代码库,几乎包含了listview的所有动画效果,如 滑入滑出, 飞入飞出,选中列表项 点击删除后,下面的列表项会有向上push up的动画效果,以及仿iphone 滑动删除列表item项动画效果. 灵活应用该...

    android开发实现加载时动画跳动和listview动态增加一行控件

    "android开发实现加载时动画跳动和listview动态增加一行控件"这个主题聚焦于两个核心知识点:加载动画的实现以及ListView的动态加载功能。 首先,加载时的动画跳动效果是提高用户交互性的一种策略,它能提供一种...

    android ListView 动画加载每一项

    总之,实现“android ListView 动画加载每一项”涉及了自定义Adapter、ViewHolder模式、动画的创建和应用,以及可能的懒加载策略。通过这种方式,我们不仅可以优化性能,还能为用户提供更具吸引力的交互体验。

Global site tag (gtag.js) - Google Analytics