本文实例讲述了Android开发实现ListView异步加载数据的方法。分享给大家供大家参考,具体如下:
1.主Activity
public class MainActivity extends Activity {  private ListView listView;  private ArrayList<Person> persons;  private ListAdapter adapter;  private Handler handler=null;  //xml文件的网络地址  final String path="http://192.168.5.10:8080/FileServer/person.xml";  @SuppressLint("HandlerLeak")  protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.main);    listView=(ListView) super.findViewById(R.id.listview);    //cache=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/cache");    //开一条子线程加载网络数据    Runnable runnable=new Runnable()    {      public void run()       {        try         {          Thread.sleep(2000);          //xmlwebData解析网络中xml中的数据          persons=XmlwebData.getData(path);          //发送消息,并把persons结合对象传递过去          handler.sendMessage(handler.obtainMessage(0, persons));        }         catch (InterruptedException e)         {          e.printStackTrace();        }      }    };    try     {      //开启线程      new Thread(runnable).start();      //handler与线程之间的通信及数据处理      handler=new Handler()      {        public void handleMessage(Message msg)         {          if(msg.what==0)          {            //msg.obj是获取handler发送信息传来的数据            @SuppressWarnings("unchecked")            ArrayList<Person> person=(ArrayList<Person>) msg.obj;            //给ListView绑定数据            BinderListData(person);          }        }      };    }     catch (Exception e)     {      e.printStackTrace();    }  }  //绑定数据  public void BinderListData(ArrayList<Person> person)  {    //创建adapter对象    adapter=new ListViewAdapter(R.layout.item,this,person);    //将Adapter绑定到listview中    listView.setAdapter(adapter);  }}2.从网络中获取xml文件并解析数据
public class XmlwebData {  private static ArrayList<Person> persons=null; 6   public static ArrayList<Person> getData(final String path)  {        try         {          URL url=new URL(path);          Person person=null;          HttpURLConnection conn=(HttpURLConnection) url.openConnection();          conn.setRequestMethod("GET");          conn.setConnectTimeout(5000);          if(conn.getResponseCode()==200)          {            InputStream inputstream=conn.getInputStream();             XmlPullParser xml=Xml.newPullParser();            xml.setInput(inputstream, "UTF-8");            int event=xml.getEventType();            while(event!=XmlPullParser.END_DOCUMENT)            {              switch (event)               {              //开始解析文档              case XmlPullParser.START_DOCUMENT:                persons=new ArrayList<Person>();                break;              case XmlPullParser.START_TAG:                String value=xml.getName();                if(value.equals("person"))                {//person对象的初始化必须在这里初始化不然可能出现为null的现象                  person=new Person();                  //获取属性值                  person.setId(new Integer(xml.getAttributeValue(0)));                }                else if(value.equals("name"))                {                  person.setName(xml.nextText());                }                else if(value.equals("sex"))                {                  person.setSex(xml.nextText());                }                else if(value.equals("age"))                {                  person.setAge(new Integer(xml.nextText()));                }                else if(value.equals("path"))                {                  person.setPath(xml.nextText());                }                break;              case XmlPullParser.END_TAG:                if(xml.getName().equals("person"))                {                  persons.add(person);                  System.out.println(person.getName());;                  person=null;                }                break;              }              //解析下一个对象              event=xml.next();            }            return persons;          }        }         catch (Exception e)         {          e.printStackTrace();        }     return null;  }}3.Person对象类
public class Person {  private int id;  private String name;  private String sex;  private String path;  public String getPath() {    return path;  }  public void setPath(String path) {    this.path = path;  }  private int age;  public int getId() {    return id;  }  public void setId(int id) {    this.id = id;  }  public String getName() {    return name;  }  public void setName(String name) {    this.name = name;  }  public String getSex() {    return sex;  }  public void setSex(String sex) {    this.sex = sex;  }  public int getAge() {    return age;  }  public void setAge(int age) {    this.age = age;  }  public Person(){  }}4.Adapter数据适配器类
public class ListViewAdapter extends BaseAdapter implements ListAdapter {  private ArrayList<Person> data;  private int id;  private Context context;  private LayoutInflater inflater;  public ListViewAdapter(int item, MainActivity mainActivity,ArrayList<Person> data)   {    this.data=data;    this.context=mainActivity;    this.id=item;    inflater=LayoutInflater.from(context);  }  @Override  public int getCount()   {    return data.size();  }  @Override  public Object getItem(int position)   {    return data.get(position);  }  @Override  public long getItemId(int position)  {    return position;  }  @Override  public View getView(int position, View view, ViewGroup arg2)  {    TextView name=null;    TextView sex=null;    TextView age=null;    ImageView img=null;    if(view==null)    {      view=inflater.inflate(id, null);      name=(TextView) view.findViewById(R.id.PersonName);      sex=(TextView) view.findViewById(R.id.PersonSex);      age=(TextView) view.findViewById(R.id.PersonAge);      img=(ImageView) view.findViewById(R.id.Personimage);      //保存view对象到ObjectClass类中      view.setTag(new ObjectClass(name,sex,age,img));    }    else    {      //得到保存的对象      ObjectClass objectclass=(ObjectClass) view.getTag();      name=objectclass.name;      sex=objectclass.sex;      age=objectclass.age;      img=objectclass.img;    }    Person person=(Person) data.get(position);    //帮数据绑定到控件上    name.setText(person.getName().toString());    sex.setText("性别:"+person.getSex().toString());    age.setText("年龄:"+String.valueOf(person.getAge()));    //加载图片资源    LoadImage(img,person.getPath());    return view;  }  private void LoadImage(ImageView img, String path)   {    //异步加载图片资源    AsyncTaskImageLoad async=new AsyncTaskImageLoad(img);    //执行异步加载,并把图片的路径传送过去    async.execute(path);  }  private final class ObjectClass  {    TextView name=null;    TextView sex=null;    TextView age=null;    ImageView img=null;    public ObjectClass(TextView name, TextView sex, TextView age,ImageView img)     {      this.name=name;      this.sex=sex;      this.age=age;      this.img=img;    }  }}5.异步加载图片类
public class AsyncTaskImageLoad extends AsyncTask<String, Integer, Bitmap> {  private ImageView Image=null;  public AsyncTaskImageLoad(ImageView img)   {    Image=img;  }  //运行在子线程中  protected Bitmap doInBackground(String... params) {    try     {      URL url=new URL(params[0]);      HttpURLConnection conn=(HttpURLConnection) url.openConnection();      conn.setRequestMethod("POST");      conn.setConnectTimeout(5000);      if(conn.getResponseCode()==200)      {        InputStream input=conn.getInputStream();        Bitmap map=BitmapFactory.decodeStream(input);        return map;      }    } catch (Exception e)     {      e.printStackTrace();    }    return null;  }  protected void onPostExecute(Bitmap result)  {    if(Image!=null && result!=null)    {      Image.setImageBitmap(result);    }    super.onPostExecute(result);  }}6.网络中的person.xml文件内容为
<?xml version="1.0" encoding="UTF-8"?><Persons> <person id="1"> <name>张三</name> <sex>男</sex> <age>25</age> <path>http://192.168.5.10:8080/FileServer/chengjisihan.jpg</path> </person> <person id="2"> <name>李斯</name> <sex>男</sex> <age>78</age> <path>http://192.168.5.10:8080/FileServer/laozi.jpg</path> </person> <person id="3"> <name>王五</name> <sex>男</sex> <age>22</age> <path>http://192.168.5.10:8080/FileServer/lilongji.jpg</path> </person> <person id="4"> <name>庞聪</name> <sex>男</sex> <age>31</age> <path>http://192.168.5.10:8080/FileServer/lishimin.jpg</path> </person> <person id="5"> <name>孙膑</name> <sex>男</sex> <age>48</age> <path>http://192.168.5.10:8080/FileServer/lisi.jpg</path> </person> <person id="6"> <name>孙武</name> <sex>男</sex> <age>58</age> <path>http://192.168.5.10:8080/FileServer/liyuan.jpg</path> </person> <person id="7"> <name>成吉思汗</name> <sex>男</sex> <age>40</age> <path>http://192.168.5.10:8080/FileServer/sunbiin.jpg</path> </person> <person id="8"> <name>李渊</name> <sex>男</sex> <age>36</age> <path>http://192.168.5.10:8080/FileServer/sunwu.jpg</path> </person> <person id="9"> <name>李隆基</name> <sex>男</sex> <age>32</age> <path>http://192.168.5.10:8080/FileServer/wangwu.jpg</path> </person> <person id="10"> <name>武则天</name> <sex>女</sex> <age>55</age> <path>http://192.168.5.10:8080/FileServer/wuzetian.jpg</path> </person></Persons><?xml version="1.0" encoding="UTF-8"?><Persons> <person id="1"> <name>张三</name> <sex>男</sex> <age>25</age> <path>http://192.168.5.10:8080/FileServer/chengjisihan.jpg</path> </person> <person id="2"> <name>李斯</name> <sex>男</sex> <age>78</age> <path>http://192.168.5.10:8080/FileServer/laozi.jpg</path> </person> <person id="3"> <name>王五</name> <sex>男</sex> <age>22</age> <path>http://192.168.5.10:8080/FileServer/lilongji.jpg</path> </person> <person id="4"> <name>庞聪</name> <sex>男</sex> <age>31</age> <path>http://192.168.5.10:8080/FileServer/lishimin.jpg</path> </person> <person id="5"> <name>孙膑</name> <sex>男</sex> <age>48</age> <path>http://192.168.5.10:8080/FileServer/lisi.jpg</path> </person> <person id="6"> <name>孙武</name> <sex>男</sex> <age>58</age> <path>http://192.168.5.10:8080/FileServer/liyuan.jpg</path> </person> <person id="7"> <name>成吉思汗</name> <sex>男</sex> <age>40</age> <path>http://192.168.5.10:8080/FileServer/sunbiin.jpg</path> </person> <person id="8"> <name>李渊</name> <sex>男</sex> <age>36</age> <path>http://192.168.5.10:8080/FileServer/sunwu.jpg</path> </person> <person id="9"> <name>李隆基</name> <sex>男</sex> <age>32</age> <path>http://192.168.5.10:8080/FileServer/wangwu.jpg</path> </person> <person id="10"> <name>武则天</name> <sex>女</sex> <age>55</age> <path>http://192.168.5.10:8080/FileServer/wuzetian.jpg</path> </person></Persons>
运行结果如下

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android数据库操作技巧总结》及《Android资源操作技巧汇总》
希望本文所述对大家Android程序设计有所帮助。
新闻热点
疑难解答