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();
- //xmlwebData解析网络中xml中的数据
- persons=XmlwebData.getData(path);
- //发送消息,并把persons结合对象传递过去
- handler.sendMessage(handler.obtainMessage(, persons));
- }
- catch (InterruptedException e)
- {
- e.printStackTrace();
- }
- }
- };
- try
- {
- //开启线程
- new Thread(runnable).start();
- //handler与线程之间的通信及数据处理
- handler=new Handler()
- {
- public void handleMessage(Message msg)
- {
- if(msg.what==)
- {
- //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; 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();
- if(conn.getResponseCode()==)
- {
- 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()));
- }
- 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[]);
- HttpURLConnection conn=(HttpURLConnection) url.openConnection();
- conn.setRequestMethod("POST");
- conn.setConnectTimeout();
- if(conn.getResponseCode()==)
- {
- 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="">
- <name>张三</name>
- <sex>男</sex>
- <age></age>
- <path>http://192.168.5.10:8080/FileServer/chengjisihan.jpg</path>
- </person>
- <person id="">
- <name>李斯</name>
- <sex>男</sex>
- <age></age>
- <path>http://192.168.5.10:8080/FileServer/laozi.jpg</path>
- </person>
- <person id="">
- <name>王五</name>
- <sex>男</sex>
- <age></age>
- <path>http://192.168.5.10:8080/FileServer/lilongji.jpg</path>
- </person>
- <person id="">
- <name>庞聪</name>
- <sex>男</sex>
- <age></age>
- <path>http://192.168.5.10:8080/FileServer/lishimin.jpg</path>
- </person>
- <person id="">
- <name>孙膑</name>
- <sex>男</sex>
- <age></age>
- <path>http://192.168.5.10:8080/FileServer/lisi.jpg</path>
- </person>
- <person id="">
- <name>孙武</name>
- <sex>男</sex>
- <age></age>
- <path>http://192.168.5.10:8080/FileServer/liyuan.jpg</path>
- </person>
- <person id="">
- <name>成吉思汗</name>
- <sex>男</sex>
- <age></age>
- <path>http://192.168.5.10:8080/FileServer/sunbiin.jpg</path>
- </person>
- <person id="">
- <name>李渊</name>
- <sex>男</sex>
- <age></age>
- <path>http://192.168.5.10:8080/FileServer/sunwu.jpg</path>
- </person>
- <person id="">
- <name>李隆基</name>
- <sex>男</sex>
- <age></age>
- <path>http://192.168.5.10:8080/FileServer/wangwu.jpg</path>
- </person>
- <person id="">
- <name>武则天</name>
- <sex>女</sex>
- <age></age>
- <path>http://192.168.5.10:8080/FileServer/wuzetian.jpg</path>
- </person>
- </Persons>
运行结果如下
Android ListView异步加载数据的更多相关文章
- android 网络异步加载数据进度条
ProgressDialog progressDialog = null; public static final int MESSAGETYPE = 0; private void execute( ...
- android listview 异步加载图片并防止错位
网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 convertView 不会出现错位现象, 重用 convertVie ...
- 又优化了一下 Android ListView 异步加载图片
写这篇文章并不是教大家怎么样用listview异步加载图片,因为这样的文章在网上已经有很多了,比如这位仁兄写的就很好: http://www.iteye.com/topic/685986 我也是因为看 ...
- Android中ListView异步加载数据
1.主Activity public class MainActivity extends Activity { private ListView listView; private ArrayLis ...
- android ListView异步加载图片(双缓存)
首先声明,参考博客地址:http://www.iteye.com/topic/685986 对于ListView,相信很多人都很熟悉,因为确实太常见了,所以,做的用户体验更好,就成了我们的追求... ...
- android ListView 分页加载数据
1.mainActivity <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" ...
- 转:Android ListView 异步加载图片
http://www.iteye.com/topic/1118828 http://www.iteye.com/topic/1127914 这样做无疑是非常可取的方法,但是加载图片时仍然会感觉到轻微的 ...
- Android的ListView异步加载图片时,错位、重复、闪烁问题的分析及解决方法
Android ListView异步加载图片错位.重复.闪烁分析以及解决方案,具体问题分析以及解决方案请看下文. 我们在使用ListView异步加载图片的时候,在快速滑动或者网络不好的情况下,会出现图 ...
- listview异步加载图片并防止错位
android listview 异步加载图片并防止错位 网上找了一张图, listview 异步加载图片之所以错位的根本原因是重用了 convertView 且有异步操作. 如果不重用 conver ...
随机推荐
- "ORA-00054: 资源正忙, 但指定以 NOWAIT 方式获取资源, 或者超时失效"的快速解决方法
引自:http://hi.baidu.com/fynaa/item/c2978952d8d542dfd48bacf6 讲了一大堆: 综合下: 解决方案:select session_id from v ...
- MVC中的URL路由(一)
URL路由系统通过对请求地址进行解析从而得到以目标Controller名称为核心的路由数据.Url路由系统最初是为了实现请求url与物理文件路径分离而建立的,MVC的Url Route是将Url地址与 ...
- DevExpres表格控件运行时动态设置表格列
本文是系列文章,陆续发表于电脑编程技巧与维护杂志. DevExpres产品是全球享有极高声誉的一流控件套包产品!国内典型用户包括:用友.金蝶.神州数码.工信部.中国石化.汉王科技等众多大中型科技型企业 ...
- SQL Server 脚本语句
一.语法结构 select select_list [ into new_table ] from table_source [ where search_condition ] [ group by ...
- gdal中文路径无法打开问题
在C#中使用OGR读写矢量数据时,需要引用“using OSGeo.OGR;”. 同时为了处理中文路径和中文字段,需要在开始设置下面两个属性,代码如下: //为了支持中文路径,请添加下面这句代码(大多 ...
- python模块与包
模块是包括python定义和声明的文件.文件名=模块名+".py".模块名保存在全局变量__name__中. 1.模块中的执行语句,只是在导入时执行一次.这些语句通常用于初始化模块 ...
- ios毛玻璃效果
方法一:支持所有ios系统版本: - (void)setupBlurView { UIImageView *darkView = [[UIImageView alloc] init]; darkVie ...
- 解决IE浏览器IFrame对象内存不释放问题
最近项目组发现在使用showModalDialog弹出窗体中如果包含IFrame对象,则IFrame对象占用的内存资源在窗体关闭后不会释放.弹出关闭反复多次后,IE浏览器内存占用可超过数百M,严重时I ...
- C# 内存法图像处理
内存法通过把图像储存在内存中进行处理,效率大大高于GetPixel方法,安全性高于指针法. 笔者当初写图像处理的时候发现网上多是用GetPixel方法实现,提到内存法的时候也没有具体实现,所以笔者在这 ...
- JamCam创业故事:辞掉工作,去开发一个应用
编者按:这是JamCam创始人的自述.这家初创公司提供的应用很简单,但是极为成功:有了JamCam,你所录制的视频会自动添加你正在iPhone中聆听的音乐,作为视频的背景音乐.和朋友分享时是不是方便多 ...