Android SimpleAdapter动态显示Bitmap图片
因为要实现从服务器中读取商品图片显示在listview中,之前写的Demo是不考虑显示图片,而是采用了本地图片进行演示,因为只需要读取文本信息,所以采用了比较简单的SimpleAdapter来实现相关功能。
具体实现如下:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
|
class GetProductUserAll extends AsyncTask<String, String, String> {
@Override
protected void onPreExecute() {
super.onPreExecute();
pDialog = new ProgressDialog(GetProductActivity.this);
pDialog.setMessage("loading..");
pDialog.setIndeterminate(false);
pDialog.setCancelable(true);
pDialog.show();
}
protected String doInBackground(String... args) {
String userIDString = String.valueOf(userID);
// Building Parameters
List<NameValuePair> params = new ArrayList<NameValuePair>();
params.add(new BasicNameValuePair("userID", userIDString));
// url to get all products list
MyApplication myApplication = (MyApplication) getApplication();
String url_user_getProduct = myApplication.getIP()
+ "vendingmachine/getProduct_user.php";
JSONObject json = jsonParser.makeHttpRequest(url_user_getProduct,
"GET", params);
try {
success = json.getInt(TAG_SUCCESS);
if (success == 1) {
getProductArray = json.getJSONArray("getProducts");
getProdcutList.clear();
for (int i = 0; i < getProductArray.length(); i++) {
JSONObject c = getProductArray.getJSONObject(i);
// Storing each json item in variable
String Number = c.getString("GetGoodNumber");
String numberOne = Number.substring(0, 4);
String numberTwo = Number.substring(4, 8);
String numberThree = Number.substring(8, 12);
String getProductNumber = numberOne + ' ' + numberTwo
+ ' ' + numberThree;
// creating new HashMap
HashMap<String, Object> map = new HashMap<String, Object>();
// adding each child node to HashMap key => value
map.put("OrderID", c.getString("OrderID"));
map.put("GoodName", c.getString("GoodName"));
map.put("GetGoodNumber", getProductNumber);
map.put("Price", c.getString("Price"));
// adding HashList to ArrayList
getProdcutList.add(map);
}
} else {
// failed to create product
}
} catch (JSONException e) {
e.printStackTrace();
}
return null;
}
protected void onPostExecute(String file_url) {
// dismiss the dialog once done
pDialog.dismiss();
if (success == 1) {
// updating listview
// HashMap<String, String>中的key
String[] from = { "OrderID", "GoodName", "GetGoodNumber",
"Price"};
// list_item.xml中对应的控件ID
int[] to = { R.id.getProduct_orderID,
R.id.getProduct_good_name, R.id.getProduct_good_number,
R.id.getProduct_good_price};
SimpleAdapter adapter = new SimpleAdapter(mContext,
getProdcutList, R.layout.getproduct_list, from, to);
listView.setAdapter(adapter);
// mPullRefreshListView.onRefreshComplete();
} else {
}
}
}
|
只截取了从服务器中读取数据并显示在listview中的代码
当我想显示图片的时候,仅仅添加map.put(“Image”, c.getString(“Image”)); 是无法得到图片信息的
步骤:
服务器中图片的存储存的是路径名,php返回的JSON值也仅仅是路径名而已,所以,如果Android需要通过给定的路径读取到图片并转换成Bitmap
1. 首先,我们需要设置缓冲区大小
|
1
|
private static final int IO_BUFFER_SIZE = 4 * 1024;
|
2. 接着实现ImageLoad类
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
|
public class ImageLoad {
/***** Get Image Resource from URL (Start) *****/
private static final int IO_BUFFER_SIZE = 4 * 1024;
private static final String Tag = "ImageLoad";
public static Bitmap loadBitmap(String url) {
Bitmap bitmap = null;
InputStream in = null;
BufferedOutputStream out = null;
try {
in = new BufferedInputStream(new URL(url).openStream(),
IO_BUFFER_SIZE);
final ByteArrayOutputStream dataStream = new ByteArrayOutputStream();
out = new BufferedOutputStream(dataStream, IO_BUFFER_SIZE);
copy(in, out);
out.flush();
final byte[] data = dataStream.toByteArray();
BitmapFactory.Options options = new BitmapFactory.Options();
// options.inSampleSize = 1;
bitmap = BitmapFactory.decodeByteArray(data, 0, data.length,
options);
Log.i(Tag, "load Bitmap success from: " + url);
} catch (IOException e) {
Log.e(Tag, "Could not load Bitmap from: " + url);
} finally {
closeStream(in);
closeStream(out);
}
return bitmap;
}
private static void closeStream(Closeable stream) {
if (stream != null) {
try {
stream.close();
} catch (IOException e) {
android.util.Log.e(Tag, "Could not close stream", e);
}
}
}
private static void copy(InputStream in, OutputStream out)
throws IOException {
byte[] b = new byte[IO_BUFFER_SIZE];
int read;
while ((read = in.read(b)) != -1) {
out.write(b, 0, read);
}
}
}
|
3. 再在之前的源程序中加入获取服务器中图片的代码:
|
1
2
3
4
|
ImageLoad imageLoad = new ImageLoad();
String imageURLString = myApplication.getIP() + "vendingmachine/" + c.getString("ImageID");
map.put("ImageID",(Bitmap) imageLoad.loadBitmap(imageURLString));
|
4.修改SimpleAdapter from和to, 把图片信息加进去,注意要一一对齐
|
1
2
3
4
5
6
7
|
String[] from = { "OrderID", "GoodName", "GetGoodNumber","Price", "ImageID" };
// list_item.xml中对应的控件ID
int[] to = { R.id.getProduct_orderID,R.id.getProduct_good_name, R.id.getProduct_good_number,
R.id.getProduct_good_price, R.id.getProduct_good_image };
SimpleAdapter adapter = new SimpleAdapter(mContext,
getProdcutList, R.layout.getproduct_list, from, to);
|
这时候运行,发现之前自定义的本地图片已经不显示了,但是获取的图片为空白,而在ImageLoad中返回的Log.i日志可以看到,URL也是正确的,这意味着Android客户端已经得到了图片,那为什么没有显示在listview中呢?
这时候翻整个工程的日志你可以看到这样一行:
|
1
|
I/System.out(284): resolveUri failed on bad bitmap uri: android.graphics.drawable.BitmapDrawable@485d7dd0
|
这是因为如果ListView要显示外部资源的话必须要设置ViewBinder,通过ViewBinder的绑定机制来显示网络资源
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
//实现ViewBinder接口
class MyViewBinder implements ViewBinder
{
/**
* view:要板顶数据的视图
* data:要绑定到视图的数据
* textRepresentation:一个表示所支持数据的安全的字符串,结果是data.toString()或空字符串,但不能是Null
* 返回值:如果数据绑定到视图返回真,否则返回假
*/
@Override
public boolean setViewValue(View view, Object data,
String textRepresentation) {
if((view instanceof ImageView)&(data instanceof Bitmap))
{
ImageView iv = (ImageView)view;
Bitmap bmp = (Bitmap)data;
iv.setImageBitmap(bmp);
return true;
}
return false;
}
}
|
并在onPostExecute函数中加入
|
1
|
adapter.setViewBinder(new MyViewBinder());
|
这样即可实现通过SimpleAdapter获取服务器中,网络或者是文件中的图片,显示在listview中
浙公网安备 33010602011771号