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

来源:互联网 发布:线缆测试仪福禄克网络 编辑:程序博客网 时间:2024/05/19 10:35

在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的内容,所以后面改了一下源码变成这个样子:

    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();              }                        };      }