热门标签 | HotTags
当前位置:  开发笔记 > Android > 正文

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

这篇文章主要介绍了Android开发实现ListView异步加载数据的方法,结合具体实例形式分析了Android操作ListView实现异步加载数据的具体步骤与相关实现技巧,需要的朋友可以参考下

本文实例讲述了Android开发实现ListView异步加载数据的方法。分享给大家供大家参考,具体如下:

1.主Activity

public class MainActivity extends Activity {
  private ListView listView;
  private ArrayList 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=(ArrayList) msg.obj;
            //给ListView绑定数据
            BinderListData(person);
          }
        }
      };
    } 
    catch (Exception e) 
    {
      e.printStackTrace();
    }
  }
  //绑定数据
  public void BinderListData(ArrayList person)
  {
    //创建adapter对象
    adapter=new ListViewAdapter(R.layout.item,this,person);
    //将Adapter绑定到listview中
    listView.setAdapter(adapter);
  }
}

2.从网络中获取xml文件并解析数据

public class XmlwebData 
{
  private static ArrayList persOns=null; 6   public static ArrayList 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();
                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 data;
  private int id;
  private Context context;
  private LayoutInflater inflater;
  public ListViewAdapter(int item, MainActivity mainActivity,ArrayList 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 {
  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文件内容为

<&#63;xml version="1.0" encoding="UTF-8"&#63;>

  
    张三
    
    25
    http://192.168.5.10:8080/FileServer/chengjisihan.jpg
  
  
    李斯
    
    78
    http://192.168.5.10:8080/FileServer/laozi.jpg
  
  
    王五
    
    22
    http://192.168.5.10:8080/FileServer/lilongji.jpg
  
  
    庞聪
    
    31
    http://192.168.5.10:8080/FileServer/lishimin.jpg
  
  
    孙膑
    
    48
    http://192.168.5.10:8080/FileServer/lisi.jpg
  
  
    孙武
    
    58
    http://192.168.5.10:8080/FileServer/liyuan.jpg
  
  
    成吉思汗
    
    40
    http://192.168.5.10:8080/FileServer/sunbiin.jpg
  
  
    李渊
    
    36
    http://192.168.5.10:8080/FileServer/sunwu.jpg
  
  
    李隆基
    
    32
    http://192.168.5.10:8080/FileServer/wangwu.jpg
  
  
    武则天
    
    55
    http://192.168.5.10:8080/FileServer/wuzetian.jpg
  

<&#63;xml version="1.0" encoding="UTF-8"&#63;>

  
    张三
    
    25
    http://192.168.5.10:8080/FileServer/chengjisihan.jpg
  
  
    李斯
    
    78
    http://192.168.5.10:8080/FileServer/laozi.jpg
  
  
    王五
    
    22
    http://192.168.5.10:8080/FileServer/lilongji.jpg
  
  
    庞聪
    
    31
    http://192.168.5.10:8080/FileServer/lishimin.jpg
  
  
    孙膑
    
    48
    http://192.168.5.10:8080/FileServer/lisi.jpg
  
  
    孙武
    
    58
    http://192.168.5.10:8080/FileServer/liyuan.jpg
  
  
    成吉思汗
    
    40
    http://192.168.5.10:8080/FileServer/sunbiin.jpg
  
  
    李渊
    
    36
    http://192.168.5.10:8080/FileServer/sunwu.jpg
  
  
    李隆基
    
    32
    http://192.168.5.10:8080/FileServer/wangwu.jpg
  
  
    武则天
    
    55
    http://192.168.5.10:8080/FileServer/wuzetian.jpg
  


运行结果如下

更多关于Android相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android数据库操作技巧总结》及《Android资源操作技巧汇总》

希望本文所述对大家Android程序设计有所帮助。


推荐阅读
  • Android 九宫格布局详解及实现:人人网应用示例
    本文深入探讨了人人网Android应用中独特的九宫格布局设计,解析其背后的GridView实现原理,并提供详细的代码示例。这种布局方式不仅美观大方,而且在现代Android应用中较为少见,值得开发者借鉴。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Android LED 数字字体的应用与实现
    本文介绍了一种适用于 Android 应用的 LED 数字字体(digital font),并详细描述了其在 UI 设计中的应用场景及其实现方法。这种字体常用于视频、广告倒计时等场景,能够增强视觉效果。 ... [详细]
  • RecyclerView初步学习(一)
    RecyclerView初步学习(一)ReCyclerView提供了一种插件式的编程模式,除了提供ViewHolder缓存模式,还可以自定义动画,分割符,布局样式,相比于传统的ListVi ... [详细]
  • 本文详细介绍了如何使用PHP检测AJAX请求,通过分析预定义服务器变量来判断请求是否来自XMLHttpRequest。此方法简单实用,适用于各种Web开发场景。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 本文探讨了 RESTful API 和传统接口之间的关键差异,解释了为什么 RESTful API 在设计和实现上具有独特的优势。 ... [详细]
  • 本文详细介绍了如何使用Spring Boot进行高效开发,涵盖了配置、实例化容器以及核心注解的使用方法。 ... [详细]
  • 本文详细介绍了Java编程语言中的核心概念和常见面试问题,包括集合类、数据结构、线程处理、Java虚拟机(JVM)、HTTP协议以及Git操作等方面的内容。通过深入分析每个主题,帮助读者更好地理解Java的关键特性和最佳实践。 ... [详细]
  • Python自动化处理:从Word文档提取内容并生成带水印的PDF
    本文介绍如何利用Python实现从特定网站下载Word文档,去除水印并添加自定义水印,最终将文档转换为PDF格式。该方法适用于批量处理和自动化需求。 ... [详细]
  • 在当前众多持久层框架中,MyBatis(前身为iBatis)凭借其轻量级、易用性和对SQL的直接支持,成为许多开发者的首选。本文将详细探讨MyBatis的核心概念、设计理念及其优势。 ... [详细]
  • 将Web服务部署到Tomcat
    本文介绍了如何在JDeveloper 12c中创建一个Java项目,并将其打包为Web服务,然后部署到Tomcat服务器。内容涵盖从项目创建、编写Web服务代码、配置相关XML文件到最终的本地部署和验证。 ... [详细]
  • XNA 3.0 游戏编程:从 XML 文件加载数据
    本文介绍如何在 XNA 3.0 游戏项目中从 XML 文件加载数据。我们将探讨如何将 XML 数据序列化为二进制文件,并通过内容管道加载到游戏中。此外,还会涉及自定义类型读取器和写入器的实现。 ... [详细]
  • 本文介绍如何在 Unity 的 XML 配置文件中,将参数传递给自定义生命周期管理器的构造函数。我们将详细探讨 CustomLifetimeManager 类的实现及其配置方法。 ... [详细]
  • 本文详细介绍了 Java 中 org.apache.xmlbeans.SchemaType 类的 getBaseEnumType() 方法,提供了多个代码示例,并解释了其在不同场景下的使用方法。 ... [详细]
author-avatar
书友36431060
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有