Android開發(fā)實(shí)現(xiàn)ListView異步加載數(shù)據(jù)的方法詳解
本文實(shí)例講述了Android開發(fā)實(shí)現(xiàn)ListView異步加載數(shù)據(jù)的方法。分享給大家供大家參考,具體如下:
1.主Activity
public class MainActivity extends Activity { private ListView listView; private ArrayList<Person> persons; private ListAdapter adapter; private Handler handler=null; //xml文件的網(wǎng)絡(luò)地址 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"); //開一條子線程加載網(wǎng)絡(luò)數(shù)據(jù) Runnable runnable=new Runnable() { public void run() { try { Thread.sleep(2000); //xmlwebData解析網(wǎng)絡(luò)中xml中的數(shù)據(jù) persons=XmlwebData.getData(path); //發(fā)送消息,并把persons結(jié)合對(duì)象傳遞過(guò)去 handler.sendMessage(handler.obtainMessage(0, persons)); } catch (InterruptedException e) { e.printStackTrace(); } } }; try { //開啟線程 new Thread(runnable).start(); //handler與線程之間的通信及數(shù)據(jù)處理 handler=new Handler() { public void handleMessage(Message msg) { if(msg.what==0) { //msg.obj是獲取handler發(fā)送信息傳來(lái)的數(shù)據(jù) @SuppressWarnings("unchecked") ArrayList<Person> person=(ArrayList<Person>) msg.obj; //給ListView綁定數(shù)據(jù) BinderListData(person); } } }; } catch (Exception e) { e.printStackTrace(); } } //綁定數(shù)據(jù) public void BinderListData(ArrayList<Person> person) { //創(chuàng)建adapter對(duì)象 adapter=new ListViewAdapter(R.layout.item,this,person); //將Adapter綁定到listview中 listView.setAdapter(adapter); } }
2.從網(wǎng)絡(luò)中獲取xml文件并解析數(shù)據(jù)
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對(duì)象的初始化必須在這里初始化不然可能出現(xiàn)為null的現(xiàn)象 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; } //解析下一個(gè)對(duì)象 event=xml.next(); } return persons; } } catch (Exception e) { e.printStackTrace(); } return null; } }
3.Person對(duì)象類
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數(shù)據(jù)適配器類
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對(duì)象到ObjectClass類中 view.setTag(new ObjectClass(name,sex,age,img)); } else { //得到保存的對(duì)象 ObjectClass objectclass=(ObjectClass) view.getTag(); name=objectclass.name; sex=objectclass.sex; age=objectclass.age; img=objectclass.img; } Person person=(Person) data.get(position); //幫數(shù)據(jù)綁定到控件上 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); //執(zhí)行異步加載,并把圖片的路徑傳送過(guò)去 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; } //運(yùn)行在子線程中 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.網(wǎng)絡(luò)中的person.xml文件內(nèi)容為
<?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>
運(yùn)行結(jié)果如下
更多關(guān)于Android相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Android控件用法總結(jié)》、《Android開發(fā)入門與進(jìn)階教程》、《Android視圖View技巧總結(jié)》、《Android編程之a(chǎn)ctivity操作技巧總結(jié)》、《Android數(shù)據(jù)庫(kù)操作技巧總結(jié)》及《Android資源操作技巧匯總》
希望本文所述對(duì)大家Android程序設(shè)計(jì)有所幫助。
- Android編程實(shí)現(xiàn)異步消息處理機(jī)制的幾種方法總結(jié)
- Android異步方法以同步方式實(shí)現(xiàn)
- Android使用OkHttp進(jìn)行網(wǎng)絡(luò)同步異步操作
- Android圖片異步加載框架Android-Universal-Image-Loader
- Android 異步任務(wù) 設(shè)置 超時(shí)使用handler更新通知功能
- Android開發(fā)之HttpClient異步請(qǐng)求數(shù)據(jù)的方法詳解【附demo源碼下載】
- Android上傳多張圖片的實(shí)例代碼(RxJava異步分發(fā))
- Android異步消息處理機(jī)制實(shí)現(xiàn)原理詳解
相關(guān)文章
Android實(shí)現(xiàn)動(dòng)畫效果的自定義下拉菜單功能
這篇文章主要介紹了Android實(shí)現(xiàn)動(dòng)畫效果的自定義下拉菜單功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02Android ViewPager實(shí)現(xiàn)無(wú)限循環(huán)效果
這篇文章主要為大家詳細(xì)介紹了Android ViewPager實(shí)現(xiàn)無(wú)限循環(huán)效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03Android?Java?try?catch?失效問題及解決
這篇文章主要介紹了Android?Java?try?catch?失效問題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11Android用Scroller實(shí)現(xiàn)一個(gè)可向上滑動(dòng)的底部導(dǎo)航欄
本篇文章主要介紹了Android用Scroller實(shí)現(xiàn)一個(gè)可上滑的底部導(dǎo)航欄,具有一定的參考價(jià)值,有興趣的小伙伴們可以參考一下2017-07-07Android使用glide加載gif動(dòng)畫設(shè)置播放次數(shù)
這篇文章主要為大家詳細(xì)介紹了Android使用glide加載gif動(dòng)畫設(shè)置播放次數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11Android游戲開發(fā):實(shí)現(xiàn)手勢(shì)操作切換圖片的實(shí)例
本文主要介紹 Android游戲開發(fā)實(shí)現(xiàn)手勢(shì)操作切換圖片的實(shí)例,這里整理了詳細(xì)的資料和示例代碼,有開發(fā)Android游戲應(yīng)用的小伙伴可以參考下2016-08-08Android ListView滑動(dòng)改變標(biāo)題欄背景漸變效果
這篇文章主要為大家詳細(xì)介紹了Android ListView滑動(dòng)改變標(biāo)題欄背景漸變效果,透明轉(zhuǎn)變成不透明,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-07-07簡(jiǎn)單實(shí)現(xiàn)android輪播圖
這篇文章主要為大家詳細(xì)介紹了android輪播圖的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2017-01-01