Android开发实现ListView异步加载数据的方法详解
更新时间:2017年11月29日 12:26:23 作者:爱生活,爱编程
这篇文章主要介绍了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程序设计有所帮助。
相关文章
Android Java try catch 失效问题及解决
这篇文章主要介绍了Android Java try catch 失效问题及解决方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教2022-11-11Android用Scroller实现一个可向上滑动的底部导航栏
本篇文章主要介绍了Android用Scroller实现一个可上滑的底部导航栏,具有一定的参考价值,有兴趣的小伙伴们可以参考一下2017-07-07
最新评论