zoukankan      html  css  js  c++  java
  • listView的异步加载数据

    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>
    复制代码

    运行结果如下

  • 相关阅读:
    git(1)-git关联GitHub-windows-转载
    jenkins(4)-jenkins配置邮件通知
    jenkins(3)-linux下安装jenkins(yum install方式)
    【PAT甲级】1090 Highest Price in Supply Chain (25 分)(DFS)
    【PAT甲级】1087 All Roads Lead to Rome (30 分)(MAP【int,string】,邻接表,DFS,模拟,SPFA)
    【PAT甲级】1018 Public Bike Management (30 分)(DFS,SPFA)
    Educational Codeforces Round 61 (Rated for Div. 2) G(线段树,单调栈)
    Atcoder Grand Contest 032C(欧拉回路,DFS判环)
    Educational Codeforces Round 62 (Rated for Div. 2)E(染色DP,构造,思维,组合数学)
    Atcoder Grand Contest 031C(构造,思维,异或,DFS)
  • 原文地址:https://www.cnblogs.com/liuguanghai/p/4479261.html
Copyright © 2011-2022 走看看