• Android ListView异步加载数据


    1.主Activity

    1 public class MainActivity extends Activity {
     2 
     3     private ListView listView;
     4     private ArrayList<Person> persons;
     5     private ListAdapter adapter;
     6     private Handler handler=null;
     7     //xml文件的网络地址
     8     final String path="http://192.168.5.10:8080/FileServer/person.xml";
     9     @SuppressLint("HandlerLeak")
    10     protected void onCreate(Bundle savedInstanceState) {
    11         super.onCreate(savedInstanceState);
    12         setContentView(R.layout.main);
    13         
    14         listView=(ListView) super.findViewById(R.id.listview);
    15         //cache=new File(Environment.getExternalStorageDirectory().getAbsolutePath()+"/cache");
    16         
    17         //开一条子线程加载网络数据
    18         Runnable runnable=new Runnable()
    19         {
    20             public void run() 
    21             {
    22                 try 
    23                 {
    24                     Thread.sleep(2000);
    25                     //xmlwebData解析网络中xml中的数据
    26                     persons=XmlwebData.getData(path);
    27                     //发送消息,并把persons结合对象传递过去
    28                     handler.sendMessage(handler.obtainMessage(0, persons));
    29                 } 
    30                 catch (InterruptedException e) 
    31                 {
    32                     e.printStackTrace();
    33                 }
    34             }
    35         };
    36 
    37         try 
    38         {
    39             //开启线程
    40             new Thread(runnable).start();
    41             //handler与线程之间的通信及数据处理
    42             handler=new Handler()
    43             {
    44                 public void handleMessage(Message msg) 
    45                 {
    46                     if(msg.what==0)
    47                     {
    48                         //msg.obj是获取handler发送信息传来的数据
    49                         @SuppressWarnings("unchecked")
    50                         ArrayList<Person> person=(ArrayList<Person>) msg.obj;
    51                         //给ListView绑定数据
    52                         BinderListData(person);
    53                     }
    54                 }
    55             };
    56         } 
    57         catch (Exception e) 
    58         {
    59             e.printStackTrace();
    60         }
    61     }
    62     
    63     //绑定数据
    64     public void BinderListData(ArrayList<Person> person)
    65     {
    66         //创建adapter对象
    67         adapter=new ListViewAdapter(R.layout.item,this,person);
    68         //将Adapter绑定到listview中
    69         listView.setAdapter(adapter);
    70     }
    71     
    72 }

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

    1 public class XmlwebData 
     2 {
     4     private static ArrayList<Person> persons=null; 6     public static ArrayList<Person> getData(final String path)
     7     {
     8                 try 
     9                 {
    10                     URL url=new URL(path);
    11                     Person person=null;
    
    13                     HttpURLConnection conn=(HttpURLConnection) url.openConnection();
    14                     conn.setRequestMethod("GET");
    15                     conn.setConnectTimeout(5000);
    16                     if(conn.getResponseCode()==200)
    17                     {
    18                         InputStream inputstream=conn.getInputStream(); 
    21                         XmlPullParser xml=Xml.newPullParser();
    22                         xml.setInput(inputstream, "UTF-8");
    23                         int event=xml.getEventType();
    24                         
    25                         while(event!=XmlPullParser.END_DOCUMENT)
    26                         {
    27                             switch (event) 
    28                             {
    29                             //开始解析文档
    30                             case XmlPullParser.START_DOCUMENT:
    31                                 persons=new ArrayList<Person>();
    32                                 break;
    33                             case XmlPullParser.START_TAG:
    34                                 
    35                                 String value=xml.getName();
    36                                 if(value.equals("person"))
    37                                 {//person对象的初始化必须在这里初始化不然可能出现为null的现象
    38                                     person=new Person();
    39                                     //获取属性值
    40                                     person.setId(new Integer(xml.getAttributeValue(0)));
    41                                 }
    42                                 else if(value.equals("name"))
    43                                 {
    44                                     person.setName(xml.nextText());
    45                                 }
    46                                 else if(value.equals("sex"))
    47                                 {
    48                                     person.setSex(xml.nextText());
    49                                 }
    50                                 else if(value.equals("age"))
    51                                 {
    52                                     person.setAge(new Integer(xml.nextText()));
    53                                 }
    54                                 else if(value.equals("path"))
    55                                 {
    56                                     person.setPath(xml.nextText());
    57                                 }
    58                                 break;
    59                             case XmlPullParser.END_TAG:
    60                                 if(xml.getName().equals("person"))
    61                                 {
    62                                     persons.add(person);
    63                                     System.out.println(person.getName());;
    64                                     person=null;
    65                                 }
    66                                 break;
    67                             }
    68                             //解析下一个对象
    69                             event=xml.next();
    70                         }
    71                         return persons;
    72                     }
    73                 } 
    74                 catch (Exception e) 
    75                 {
    76                     e.printStackTrace();
    77                 } 
    78             
    79         
    80         return null;
    81     
    82     }
    83 
    84 }

    3.Person对象类

     1 public class Person 
     2 {
     3     private int id;
     4     private String name;
     5     private String sex;
     6     private String path;
     7     public String getPath() {
     8         return path;
     9     }
    10     public void setPath(String path) {
    11         this.path = path;
    12     }
    13     private int age;
    14     public int getId() {
    15         return id;
    16     }
    17     public void setId(int id) {
    18         this.id = id;
    19     }
    20     public String getName() {
    21         return name;
    22     }
    23     public void setName(String name) {
    24         this.name = name;
    25     }
    26     public String getSex() {
    27         return sex;
    28     }
    29     public void setSex(String sex) {
    30         this.sex = sex;
    31     }
    32     public int getAge() {
    33         return age;
    34     }
    35     public void setAge(int age) {
    36         this.age = age;
    37     }
    38     public Person(){
    39         
    40     }
    41 }

    4.Adapter数据适配器类

     1 public class ListViewAdapter extends BaseAdapter implements ListAdapter 
     2 {
     3 
     4     private ArrayList<Person> data;
     5     private int id;
     6     private Context context;
     7     private LayoutInflater inflater;
     8     public ListViewAdapter(int item, MainActivity mainActivity,ArrayList<Person> data) 
     9     {
    10         this.data=data;
    11         this.context=mainActivity;
    12         this.id=item;
    13         inflater=LayoutInflater.from(context);
    14     }
    15 
    16     @Override
    17     public int getCount() 
    18     {
    19         return data.size();
    20     }
    21 
    22     @Override
    23     public Object getItem(int position) 
    24     {
    25         return data.get(position);
    26     }
    27 
    28     @Override
    29     public long getItemId(int position)
    30     {
    31         return position;
    32     }
    33 
    34     @Override
    35     public View getView(int position, View view, ViewGroup arg2)
    36     {
    37         TextView name=null;
    38         TextView sex=null;
    39         TextView age=null;
    40         ImageView img=null;
    41         if(view==null)
    42         {
    43             view=inflater.inflate(id, null);
    44             name=(TextView) view.findViewById(R.id.PersonName);
    45             sex=(TextView) view.findViewById(R.id.PersonSex);
    46             age=(TextView) view.findViewById(R.id.PersonAge);
    47             img=(ImageView) view.findViewById(R.id.Personimage);
    48             //保存view对象到ObjectClass类中
    49             view.setTag(new ObjectClass(name,sex,age,img));
    50         }
    51         else
    52         {
    53             //得到保存的对象
    54             ObjectClass objectclass=(ObjectClass) view.getTag();
    55             name=objectclass.name;
    56             sex=objectclass.sex;
    57             age=objectclass.age;
    58             img=objectclass.img;
    59         }
    60         
    61         Person person=(Person) data.get(position);
    62         //帮数据绑定到控件上
    63         name.setText(person.getName().toString());
    64         sex.setText("性别:"+person.getSex().toString());
    65         age.setText("年龄:"+String.valueOf(person.getAge()));
    66         //加载图片资源
    67         LoadImage(img,person.getPath());
    68         return view;
    69         
    70     }
    71 
    72     private void LoadImage(ImageView img, String path) 
    73     {
    74         //异步加载图片资源
    75         AsyncTaskImageLoad async=new AsyncTaskImageLoad(img);
    76         //执行异步加载,并把图片的路径传送过去
    77         async.execute(path);
    78         
    79     }
    80 
    81     private final class ObjectClass
    82     {
    83         TextView name=null;
    84         TextView sex=null;
    85         TextView age=null;
    86         ImageView img=null;
    87         public ObjectClass(TextView name, TextView sex, TextView age,ImageView img) 
    88         {
    89             this.name=name;
    90             this.sex=sex;
    91             this.age=age;
    92             this.img=img;
    93         }
    94     }
    95     
    97 }

    5.异步加载图片类

    1 public class AsyncTaskImageLoad extends AsyncTask<String, Integer, Bitmap> {
     2 
     3     private ImageView Image=null;
     4     
     5     public AsyncTaskImageLoad(ImageView img) 
     6     {
     7         Image=img;
     8     }
     9     //运行在子线程中
    10     protected Bitmap doInBackground(String... params) {
    11         try 
    12         {
    13             URL url=new URL(params[0]);
    14             HttpURLConnection conn=(HttpURLConnection) url.openConnection();
    15             conn.setRequestMethod("POST");
    16             conn.setConnectTimeout(5000);
    17             if(conn.getResponseCode()==200)
    18             {
    19                 InputStream input=conn.getInputStream();
    20                 Bitmap map=BitmapFactory.decodeStream(input);
    21                 return map;
    22             }
    23         } catch (Exception e) 
    24         {
    25             e.printStackTrace();
    26         }
    27         return null;
    28     }
    29 
    30     protected void onPostExecute(Bitmap result)
    31     {
    32         if(Image!=null && result!=null)
    33         {
    34             Image.setImageBitmap(result);
    35         }
    36         
    37         super.onPostExecute(result);
    38     }
    39 }

    6.网络中的person.xml文件内容为

    1 <?xml version="1.0" encoding="UTF-8"?>
     2 <Persons>
     3     <person id="1">
     4         <name>张三</name>
     5         <sex>男</sex>
     6         <age>25</age>
     7         <path>http://192.168.5.10:8080/FileServer/chengjisihan.jpg</path>
     8     </person>
     9     <person id="2">
    10         <name>李斯</name>
    11         <sex>男</sex>
    12         <age>78</age>
    13         <path>http://192.168.5.10:8080/FileServer/laozi.jpg</path>
    14     </person>
    15     <person id="3">
    16         <name>王五</name>
    17         <sex>男</sex>
    18         <age>22</age>
    19         <path>http://192.168.5.10:8080/FileServer/lilongji.jpg</path>
    20     </person>
    21     <person id="4">
    22         <name>庞聪</name>
    23         <sex>男</sex>
    24         <age>31</age>
    25         <path>http://192.168.5.10:8080/FileServer/lishimin.jpg</path>
    26     </person>
    27     <person id="5">
    28         <name>孙膑</name>
    29         <sex>男</sex>
    30         <age>48</age>
    31         <path>http://192.168.5.10:8080/FileServer/lisi.jpg</path>
    32     </person>
    33     <person id="6">
    34         <name>孙武</name>
    35         <sex>男</sex>
    36         <age>58</age>
    37         <path>http://192.168.5.10:8080/FileServer/liyuan.jpg</path>
    38     </person>
    39     
    40     <person id="7">
    41         <name>成吉思汗</name>
    42         <sex>男</sex>
    43         <age>40</age>
    44         <path>http://192.168.5.10:8080/FileServer/sunbiin.jpg</path>
    45     </person>
    46     
    47     <person id="8">
    48         <name>李渊</name>
    49         <sex>男</sex>
    50         <age>36</age>
    51         <path>http://192.168.5.10:8080/FileServer/sunwu.jpg</path>
    52     </person>
    53     
    54     <person id="9">
    55         <name>李隆基</name>
    56         <sex>男</sex>
    57         <age>32</age>
    58         <path>http://192.168.5.10:8080/FileServer/wangwu.jpg</path>
    59     </person>
    60     <person id="10">
    61         <name>武则天</name>
    62         <sex>女</sex>
    63         <age>55</age>
    64         <path>http://192.168.5.10:8080/FileServer/wuzetian.jpg</path>
    65     </person>
    66 </Persons>

    运行结果如下

  • 相关阅读:
    转:深入 AngularUI Router
    angularJS $scope的$apply方法实现model刷新
    CSS 如何让 height:100%; 起作用
    【AngularJs】---$sce 输出Html
    angular 组件之间传值
    kendo Grid 列添加自定义模板
    关于“内控点”
    关于总结
    咏春
    一只老鼠夹
  • 原文地址:https://www.cnblogs.com/zhujiabin/p/4331504.html
Copyright © 2020-2023  润新知