Android开发实现ListView异步加载数据的方法详解

本文实例讲述了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程序设计有所帮助。

您可能感兴趣的文章:

  • Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案
  • Android实现Listview异步加载网络图片并动态更新的方法
  • Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)
  • Android ListView异步加载图片方法详解
  • Android实现ListView异步加载图片的方法
  • Android实现ListView异步加载的方法(改进版)
  • Android实现上拉加载更多以及下拉刷新功能(ListView)
  • Android之ListView分页加载数据功能实现代码
  • Android实现ListView分页自动加载数据的方法
  • Android ListView实现上拉加载更多和下拉刷新功能
  • 基于Android ListView之加载使用技巧
(0)

相关推荐

  • Android实现Listview异步加载网络图片并动态更新的方法

    本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法.分享给大家供大家参考,具体如下: 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片.店名.活动详情.地址.电话和距离等. 在布局文件中ListView的定义: <ListView android:id="@id/maplistview" android:background="@drawable/bg" android:layout_width=&qu

  • Android程序开发ListView+Json+异步网络图片加载+滚动翻页的例子(图片能缓存,图片不错乱)

    例子中用于解析Json的Gson请自己Google下载 主Activity: package COM.Example.Main; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedList; import java.util.List; import java.util.Map; import COM.Example.Main.R; import COM.Example.Main.stringG

  • Android实现上拉加载更多以及下拉刷新功能(ListView)

    首先为大家介绍Andorid5.0原生下拉刷新简单实现. 先上效果图: 相对于上一个19.1.0版本中的横条效果好看了很多.使用起来也很简单. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/container" and

  • Android实现ListView异步加载图片的方法

    本文实例讲述了Android实现ListView异步加载图片的方法.分享给大家供大家参考.具体如下: ListView异步加载图片是非常实用的方法,凡是是要通过网络获取图片资源一般使用这种方法比较好,用户体验好,不用让用户等待下去,下面就说实现方法,先贴上主方法的代码: package cn.wangmeng.test; import java.io.IOException; import java.io.InputStream; import java.lang.ref.SoftReferen

  • Android之ListView分页加载数据功能实现代码

    什么是ListView分页加载数据功能呢?在现在的大数据时代,我们不可能把某些数据全部展示到界面,好比我们经常会看的QQ空间一样,当你看动态的时候,系统不可能会把所有好友的动态都展示在上面,你能看到的一般都是最新好友更新的动态,假如你要看非最新的好友动态,通常你都会手指向上滑动屏幕然后去查看,当界面下滑到一定数量的时候,就会看到一个"查看更多",然后突然停顿一下,系统会通过网络去给你刷新其他动态信息,这样的功能我们一般叫做数据下拉刷新功能,也就是我们的分页加载功能,具体的实现是怎样的呢

  • Android中ListView异步加载图片错位、重复、闪烁问题分析及解决方案

    Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图片错位.重复.闪烁等问题,其实这些问题总结起来就是一个问题,我们需要对这些问题进行ListView的优化. 比如ListView上有100个Item,一屏只显示10个Item,我们知道getView()中convertView是用来复用View对象的,因为一个Item的对应一个View对象,而Ima

  • Android实现ListView分页自动加载数据的方法

    Android应用开发中,采用ListView组件来展示数据是很常用的功能,当一个应用要展现很多的数据时,一般情况下都不会把所有的数据一次就展示出来,而是通过分页的形式来展示数据,个人觉得这样会有更好的用户体验.因此,很多应用都是采用分批次加载的形式来获取用户所需的数据.例如:微博客户端可能会在用户滑动至列表底端时自动加载下一页数据,也可能在底部放置一个"查看更多"按钮,用户点击后,加载下一页数据. 下面通过一个Demo来展示ListView功能如何实现:该Demo通过在ListVie

  • Android ListView异步加载图片方法详解

    本文实例讲述了Android ListView异步加载图片方法.分享给大家供大家参考,具体如下: 先说说这篇文章的优点把,开启线程异步加载图片,然后刷新UI显示图片,而且通过弱引用缓存网络加载的图片,节省了再次连接网络的开销. 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的卡屏现象,特别是listview里的item在进行快速滑动的时候. 我找了一下原因,可能是在listview快速滑动屏幕的时候划过的item太多 而且每次调用getView方法后就会异步的在过去某个时间内用han

  • 基于Android ListView之加载使用技巧

    程序员很多,遍地都是,高手也很多,但是懂设计的程序员并不多,我觉得我们不仅要成为一个coder还要成为一个designer. 我是一个比较注重ued的人,如果对一个app来说,程序是app的内涵那么设计就是要体现app的外在美观. 曾经看到一篇招聘用户体验设计师的信息问道 如果说,在我们身边,设计师具有表达思想的力量:工程师具有实现思想的力量. 那么请问用户体验设计师具有什么力量,有资格成为团队成员? 每个人有每个的思想每个人有每个人的见解,这就不多讲留给大家去思考. 我手机装的应用并不多,稍微

  • Android实现ListView异步加载的方法(改进版)

    本文实例讲述了Android实现ListView异步加载的方法.分享给大家供大家参考,具体如下: @Override public View getView(int position, View convertView, ViewGroup parent) { ---- ViewHolder VH = null; ---- VH.mImageView.setTag(position); VH.mThumb.setImageDrawable(imageLoader.loadDrawable(pos

  • Android ListView实现上拉加载更多和下拉刷新功能

    本文实例为大家介绍了Android ListView下拉刷新功能的实现方法和功能,供大家参考,具体内容如下 1.ListView优化方式 界面缓存:ViewHolder+convertView 分页加载:上拉刷新 图片缓存 快速滑动ListView禁止刷新 2.效果 3.上拉加载更多原理及实现 当我们手指滑动到listview最后位置的时候,我们触发加载数据的方法.这触发之前我们需要做一些工作,包括: 如何判断滑动到最后? 如何避免重复加载数据? 加载之后如何刷新界面? 1).界面实现AbsLi

随机推荐