软件编程
位置:首页>> 软件编程>> Android编程>> Android开发实现ListView异步加载数据的方法详解

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

作者:爱生活,爱编程  发布时间:2022-03-26 02:31:57 

标签: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开发实现ListView异步加载数据的方法详解

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

来源:http://www.cnblogs.com/snake-hand/p/3206655.html

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com