Android开发实现ListView异步加载数据的方法详解
时间:2019-04-10
本文章向大家介绍Android开发实现ListView异步加载数据的方法详解,主要包括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相关内容感兴趣的读者可查看本站专题:《Android控件用法总结》、《Android开发入门与进阶教程》、《Android视图View技巧总结》、《Android编程之activity操作技巧总结》、《Android数据库操作技巧总结》及《Android资源操作技巧汇总》
希望本文所述对大家Android程序设计有所帮助。
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- SQL-JOIN全解析
- Node.js上传单文件和多文件的一些示例博客和源代码
- ES6中的箭头函数=>
- 22 个让 React 开发更高效更有趣的工具
- JavaScript中==和===的区别
- 解决:打包SpringBoot项目成jar包后,其他的项目无法引入jar包中的对象
- 【分享】MPSoC R5引导4个A53和两个R5的应用程序的例子
- 【分享】MPSoC交叉编译例子
- JSON.stringify() 的 5 个秘密特性
- Kyverno - Kubernetes 原生策略管理引擎
- 你不知道的 Vue 单元测试(6000字实战单元测试)
- Linux系统异常排查实践与总结
- 它会不会成为OCR领域霸主?经过一个月的分析,我得出了这些结论
- 【一天一大 lee】二叉搜索树中的插入操作 (难度:中等) - Day20200930
- docker 由于iptables导致无法正常启动问题临时解决方案