应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片、店名、活动详情、地址、电话和距离等。
在布局文件中ListView的定义:
<ListView android:id="@id/maplistview" android:background="@drawable/bg" android:layout_width="fill_parent" android:layout_height="fill_parent" android:cacheColorHint="#00000000"android:divider="@drawable/separator" android:dividerHeight="2.0px" android:layout_below="@id/mapseparator"/>
在布局文件ListViewItem,中定义活动图片、店名、活动详情、地址、电话和距离的布局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout android:id="@+id/RelativeLayout01" android:layout_width="fill_parent" xmlns:android="http://schemas.android.com/apk/res/android" android:layout_height="wrap_content" android:paddingBottom="2dip" android:paddingLeft="2dip" android:paddingRight="2dip">
<ImageView android:paddingTop="2dip" android:layout_alignParentLeft="true" android:layout_width="80px"android:layout_height="80px" android:id="@+id/maplistviewitemImage"/>
<TextView android:layout_height="wrap_content" android:textSize="17dip"android:layout_width="fill_parent" android:id="@+id/maplistviewitemshopname"android:layout_toRightOf="@id/maplistviewitemImage"android:textColor="#000000"/>
<TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_alignParentLeft="true" android:layout_below="@+id/maplistviewitemImage" android:id="@+id/maplistviewitemActi" android:textColor="#6C6C6C"/>
<TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_alignParentLeft="true" android:layout_below="@+id/maplistviewitemActi" android:id="@+id/maplistviewitemaddr" android:textColor="#6C6C6C" android:singleLine="true"/>
<TextView android:layout_height="wrap_content" android:layout_width="fill_parent" android:layout_alignParentLeft="true" android:layout_below="@+id/maplistviewitemaddr" android:id="@+id/maplistviewitemtelphone" android:textColor="#6C6C6C" android:singleLine="true"/>
</RelativeLayout>
(1)定义类MapListImageAndText管理ListViewItem中控件的内容
(2)定义类MapListViewCache实例化ListViewItem中的控件
(3)定义类AsyncImageLoader,开启线程下载指定图片
(4)定义类MapListImageAndTextListAdapter继承ArrayAdapter,用于创建AsyncImageLoader实例,并指定控件的内容
(5)主程序中Listview与MapListImageAndTextListAdapter的捆绑
[代码] (1)定义类MapListImageAndText管理ListViewItem中控件的内容
01 package com.google.zxing.client.android.AsyncLoadImage;
02
03
04
05 public class MapListImageAndText {
06private String imageUrl;
07private String shopname;
08private String activitynifo;
09private String address;
10private String telephone;
11private String distance;
12
13public MapListImageAndText(String imageUrl, String shopname, String activitynifo, String address, String telephone,String distance) {
14this.imageUrl = imageUrl;
15this.shopname = shopname;
16this.activitynifo = activitynifo;
17this.address = address;
18this.telephone = telephone;
19this.distance=distance;
20}
21
22public String getImageUrl() {
23return imageUrl;
24}
25
26public String getShopname() {
27return shopname;
28}
29
30public String getActivitynifo() {
31return activitynifo;
32}
33
34public String getAddress() {
35return address;
36}
37
38public String getTelephone() {
39return telephone;
40}
41
42public String getDistance() {
43return distance;
44}
45
46
47 }
[代码] (2)定义类MapListViewCache实例化ListViewItem中的控件
01 package com.google.zxing.client.android.AsyncLoadImage;
02
03 import com.google.zxing.client.android.R;
04
05 import android.view.View;
06 import android.widget.ImageView;
07 import android.widget.TextView;
08
09 public class MapListViewCache {
10
11private View baseView;
12private TextView shopname;
13private TextView activitynifo;
14private TextView address;
15private TextView telephone;
16private TextView distance;
17
18private ImageView imageView;
19
20public MapListViewCache(View baseView) {
21this.baseView = baseView;
22}
23
24public TextView getShopname() {
25if (shopname == null) {
26shopname = (TextView) baseView.findViewById(R.id.maplistviewitemshopname);
27}
28return shopname;
29}
30
31public TextView getActivitynifo() {
32if (activitynifo == null) {
33activitynifo = (TextView) baseView.findViewById(R.id.maplistviewitemActi);
34}
35return activitynifo;
36}
37
38public TextView getAddress() {
39if (address == null) {
40address = (TextView) baseView.findViewById(R.id.maplistviewitemaddr);
41}
42return address;
43}
44
45public TextView getTelephone() {
46if (telephone == null) {
47telephone = (TextView) baseView.findViewById(R.id.maplistviewitemtelphone);
48}
49return telephone;
50}
51
52public ImageView getImageView() {
53if (imageView == null) {
54imageView = (ImageView) baseView.findViewById(R.id.maplistviewitemImage);
55}
56return imageView;
57}
58
59public TextView getDistance() {
60if (distance == null) {
61distance = (TextView) baseView.findViewById(R.id.maplistviewitemdistance);
62}
63return distance;
64}
65
66 }
[代码] (3)定义类AsyncImageLoader,开启线程下载指定图片
01 package com.google.zxing.client.android.AsyncLoadImage;
02
03 import java.io.IOException;
04 import java.io.InputStream;
05 import java.lang.ref.SoftReference;
06 import java.net.MalformedURLException;
07 import java.net.URL;
08 import java.util.HashMap;
09
10 import android.graphics.drawable.Drawable;
11 import android.os.Handler;
12 import android.os.Message;
13
14 public class AsyncImageLoader {
15
16private HashMap<String, SoftReference<Drawable>> imageCache;
17
18public AsyncImageLoader() {
19imageCache = new HashMap<String, SoftReference<Drawable>>();
20}
21
22public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {
23if (imageCache.containsKey(imageUrl)) {
24SoftReference<Drawable> softReference = imageCache.get(imageUrl);
25Drawable drawable = softReference.get();
26if (drawable != null) {
27return drawable;
28}
29}
30final Handler handler = new Handler() {
31public void handleMessage(Message message) {
32imageCallback.imageLoaded((Drawable) message.obj, imageUrl);
33}
34};
35new Thread() {
36@Override
37public void run() {
38Drawable drawable = loadImageFromUrl(imageUrl);
39imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));
40Message message = handler.obtainMessage(0, drawable);
41handler.sendMessage(message);
42}
43}.start();
44return null;
45}
46
47public static Drawable loadImageFromUrl(String url) {
48URL m;
49InputStream i = null;
50try {
51m = new URL(url);
52i = (InputStream) m.getContent();
53} catch (MalformedURLException e1) {
54e1.printStackTrace();
55} catch (IOException e) {
56e.printStackTrace();
57}
58Drawable d = Drawable.createFromStream(i, "src");
59return d;
60}
61
62public interface ImageCallback {
63public void imageLoaded(Drawable imageDrawable, String imageUrl);
64}
65
66 }
[代码] (4)定义类MapListImageAndTextListAdapter继承ArrayAdapter
01 package com.google.zxing.client.android.AsyncLoadImage;
02
03 import java.util.List;
04
05 import com.google.zxing.client.android.R;
06
07 import com.google.zxing.client.android.AsyncLoadImage.AsyncImageLoader.ImageCallback;
08
09 import android.app.Activity;
10 import android.graphics.drawable.Drawable;
11 import android.view.LayoutInflater;
12 import android.view.View;
13 import android.view.ViewGroup;
14 import android.widget.ArrayAdapter;
15 import android.widget.ImageView;
16 import android.widget.ListView;
17 import android.widget.TextView;
18
19 public class MapListImageAndTextListAdapter extends ArrayAdapter<MapListImageAndText> {
20
21private ListView listView;
22private AsyncImageLoader asyncImageLoader;
23
24public MapListImageAndTextListAdapter(Activity activity, List<MapListImageAndText> imageAndTexts, ListView listView) {
25super(activity, 0, imageAndTexts);
26this.listView = listView;
27asyncImageLoader = new AsyncImageLoader();
28}
29
30public View getView(int position, View convertView, ViewGroup parent) {
31Activity activity = (Activity) getContext();
32
33// Inflate the views from XML
34View rowView = convertView;
35MapListViewCache viewCache;
36if (rowView == null) {
37LayoutInflater inflater = activity.getLayoutInflater();
38rowView = inflater.inflate(R.layout.maplistviewitem, null);
39viewCache = new MapListViewCache(rowView);
40rowView.setTag(viewCache);
41} else {
42viewCache = (MapListViewCache) rowView.getTag();
43}
44MapListImageAndText imageAndText = getItem(position);
45
46// Load the image and set it on the ImageView
47String imageUrl = imageAndText.getImageUrl();
48ImageView imageView = viewCache.getImageView();
49imageView.setTag(imageUrl);
50Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() {
51
52
53public void imageLoaded(Drawable imageDrawable, String imageUrl) {
54ImageView imageViewByTag = (ImageView) listView.findViewWithTag(imageUrl);
55if (imageViewByTag != null) {
56imageViewByTag.setImageDrawable(imageDrawable);
57}
58}
59});
60if (cachedImage == null) {
61imageView.setImageResource(R.drawable.refresh);
62}else{
63imageView.setImageDrawable(cachedImage);
64}
65// Set the text on the TextView
66TextView shopname = viewCache.getShopname();
67shopname.setText(imageAndText.getShopname());
68
69TextView activitynifo = viewCache.getActivitynifo();
70activitynifo.setText(imageAndText.getActivitynifo());
71
72TextView address = viewCache.getAddress();
73address.setText(imageAndText.getAddress());
74
75TextView telephone = viewCache.getTelephone();
76telephone.setText(imageAndText.getTelephone());
77
78TextView distance = viewCache.getDistance();
79distance.setText(imageAndText.getDistance());
80
81return rowView;
82}
83
84 }
[代码] (5)主程序中Listview与MapListImageAndTextListAdapter的捆绑
01 //tuangoupoints为对后台传回来的数据解析后得到的字符串
02 String[] mtuangoupoints =tuangoupoints.split("@");
03
04 List<MapListImageAndText> dataArray=new ArrayList<MapListImageAndText>();
05
06 for(int i=0; i<mtuangoupoints.length;i++){
07String[] tonepoint=mtuangoupoints[i].split("#");
08
09String shopname=String.valueOf(i+1)+tonepoint[2];
10String activityinfo=tonepoint[1];
11String address=tonepoint[6];
12String telephone=tonepoint[7];
13String imageurl=tonepoint[8];
14String distance=tonepoint[5];
15
16MapListImageAndText test=new MapListImageAndText(imageurl,shopname,activityinfo,address,telephone,distance);
17dataArray.add(test);
18 }
19
20 MapListImageAndTextListAdapter adapter=new MapListImageAndTextListAdapter(this, dataArray, mlistView);
21 mlistView.setAdapter(adapter);