Android開(kāi)發(fā)實(shí)現(xiàn)ListView異步加載數(shù)據(jù)的方法詳解
本文實(shí)例講述了Android開(kāi)發(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");
//開(kāi)一條子線程加載網(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
{
//開(kāi)啟線程
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)
{
//開(kāi)始解析文檔
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ì)象類(lèi)
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ù)適配器類(lèi)
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類(lèi)中
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.異步加載圖片類(lèi)
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)容感興趣的讀者可查看本站專(zhuān)題:《Android控件用法總結(jié)》、《Android開(kāi)發(fā)入門(mén)與進(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開(kāi)發(fā)之HttpClient異步請(qǐng)求數(shù)據(jù)的方法詳解【附demo源碼下載】
- Android上傳多張圖片的實(shí)例代碼(RxJava異步分發(fā))
- Android異步消息處理機(jī)制實(shí)現(xiàn)原理詳解
相關(guān)文章
Android實(shí)現(xiàn)動(dòng)畫(huà)效果的自定義下拉菜單功能
這篇文章主要介紹了Android實(shí)現(xiàn)動(dòng)畫(huà)效果的自定義下拉菜單功能,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-02-02
Android ViewPager實(shí)現(xiàn)無(wú)限循環(huán)效果
這篇文章主要為大家詳細(xì)介紹了Android ViewPager實(shí)現(xiàn)無(wú)限循環(huán)效果的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-03-03
Android?Java?try?catch?失效問(wèn)題及解決
這篇文章主要介紹了Android?Java?try?catch?失效問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-11-11
Android用Scroller實(shí)現(xiàn)一個(gè)可向上滑動(dòng)的底部導(dǎo)航欄
本篇文章主要介紹了Android用Scroller實(shí)現(xiàn)一個(gè)可上滑的底部導(dǎo)航欄,具有一定的參考價(jià)值,有興趣的小伙伴們可以參考一下2017-07-07
Android使用glide加載gif動(dòng)畫(huà)設(shè)置播放次數(shù)
這篇文章主要為大家詳細(xì)介紹了Android使用glide加載gif動(dòng)畫(huà)設(shè)置播放次數(shù),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-11-11
Android游戲開(kāi)發(fā):實(shí)現(xiàn)手勢(shì)操作切換圖片的實(shí)例
本文主要介紹 Android游戲開(kāi)發(fā)實(shí)現(xiàn)手勢(shì)操作切換圖片的實(shí)例,這里整理了詳細(xì)的資料和示例代碼,有開(kāi)發(fā)Android游戲應(yīng)用的小伙伴可以參考下2016-08-08
Android 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

