我目前有一个简单的列表视图适配器,它包含两行文本。我接下来要做的是添加显示用户在列表视图中拍摄的照片的选项。我像这样修改了我的列表适配器:
standardAdapter = new SimpleAdapter(this, list, R.layout.post_layout,
new String[] { "time", "post", "image"}, new int[] {
R.id.postTimeTextView, R.id.postTextView, R.id.post_imageView});
然后我像往常一样将它添加到哈希映射中并刷新适配器:
// create a new hash map with the text from the post
feedPostMap = new HashMap<String, Object>();
feedPostMap.put("time", currentTimePost);
feedPostMap.put("post", post);
if(photoWasTaken == 1){
feedPostMap.put("image", pictureTaken);
}
//add map to list
list.add(feedPostMap);
// refresh the adapter
standardAdapter.notifyDataSetChanged();
最后,这是结果活动的代码:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
Log.d(TAG, "ON activity for result- CAMERA");
if (resultCode == Activity.RESULT_OK) {
//get and decode the file
pictureTaken = BitmapFactory.decodeFile("/sdcard/livefeedrTemp.png");
//Display picture above the text box
imageViewShowPictureTaken.setImageBitmap(pictureTaken);
displayPhotoLayout.setVisibility(LinearLayout.VISIBLE);
//NEW - make photo variable = 1
photoWasTaken = 1;
}
}
但是我遇到了一个问题。位图形式的照片未添加到列表视图中。它只是显示为空白空间。我在这里做错了吗?其次,如果用户决定不拍照,则不应显示图像视图。我不确定如何实现这一点。我应该创建自定义列表适配器吗?
感谢您的帮助
答案 0 :(得分:2)
问题是SimpleAdapter默认不支持位图。
默认情况下,该值将被视为图像资源。如果 value不能用作图像资源,该值用作 图片Uri。
然而,有一个解决方案。您可以设置自定义ViewBinder并自行进行绑定。
class MyViewBinder implements SimpleAdapter.ViewBinder {
@Override
public boolean setViewValue(View view, Object data, String textRepresentation) {
if (view instanceof ImageView && data instanceof Bitmap) {
ImageView v = (ImageView)view;
v.setImageBitmap((Bitmap)data);
// return true to signal that bind was successful
return true;
}
return false;
}
}
并将其设置为SimpleAdapter:
adapter.setViewBinder(new MyViewBinder());
这样,每次SimpleAdapter尝试将值绑定到View时,它首先会调用View binder的setViewValue方法。如果它返回false,它会尝试自己绑定它。
您还可以尝试将URL作为指向SD卡位置的字符串放入地图。但我不确定SimpleAdapter可以处理这个问题。