首页 > 系统 > Android > 正文

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

2019-10-22 18:21:58
字体:
来源:转载
供稿:网友

本文实例讲述了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,ListView,异步,加载数据

 

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


注:相关教程知识阅读请移步到Android开发频道。
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表