您好,登錄后才能下訂單哦!
本文實例講述了Android開發(fā)實現(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é)合對象傳遞過去 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ā)送信息傳來的數(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對象 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對象的初始化必須在這里初始化不然可能出現(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; } //解析下一個對象 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數(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對象到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); //幫數(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í)行異步加載,并把圖片的路徑傳送過去 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.網(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>
運行結(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ù)庫操作技巧總結(jié)》及《Android資源操作技巧匯總》
希望本文所述對大家Android程序設(shè)計有所幫助。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。