我应该如何在 ListView 中设置此位图?

How should I set this Bitmap in ListView?

我的本地数据库中有图像,我想将其填充到列表视图中。

这就是我正在做的事情:

...
          bitmap[i] = MySQLiteHelper.getImage(images[i]);
 // This fetches the bitmap image from database
...

在这里,我正在将我的位图转换为可绘制对象。

d[i] = new BitmapDrawable(getResources(),bitmap[i]);

然后我在 HashMap 的 put 方法中使用这个 Drawable 将其设置为 listView 项。

hm.put("img", String.valueOf(d[i]));
// put() accepts java.lang.String as input.

但是列表视图中没有显示图像。我可以显示所有文本,但不能显示图像。

我的 LogCat 中出现以下错误:

BitmapFactory﹕ Unable to decode stream: java.io.FileNotFoundException: android.graphics.drawable.BitmapDrawable@3ab28e36: open failed: ENOENT (No such file or directory)
    resolveUri failed on bad bitmap uri: android.graphics.drawable.BitmapDrawable@3ab28e36

我做错了什么?我认为当将该 Bitmap 转换为 Drawable 时,drawable 持有一个临时值而 put() 无法访问它?伙计们,这里有什么问题吗?

编辑:

我的HashMap代码:

 List<HashMap<String,String>> aList = new ArrayList<HashMap<String,String>>();

for(int i=0;i<len;i++){
    HashMap<String, String> hm = new HashMap<String,String>();
    hm.put("img", String.valueOf(d[i]));
    hm.put("tit", "   Title : " + title[i]);
    hm.put("init", "   Initial Price  : " + init_price[i]);
    hm.put("cur"," Current Price  : " + cur_price[i]);
    aList.add(hm);
}

// Keys used in Hashmap
String[] from = { "img","tit","init","cur" };

// Ids of views in listview_layout
int[] to = { R.id.img,R.id.tit,R.id.init,R.id.cur};

getImage() 方法:

图像(位图)作为 BLOB 存储在数据库中。我以 ByteArray 的形式获得了它。 现在,我使用以下方法将其转换回位图。

 // convert from byte array to bitmap
    public static Bitmap getImage(byte[] image) {
        return BitmapFactory.decodeByteArray(image, 0, image.length);
    }

My Logcat : 在使用 Base64Bitmap 转换为 String

之后

(注意:考虑使用新的 RecyclerView 而不是 ListView 以获得更好的性能)

您要做的是将 String 转换为 BitmapDrawable(以防 MySQLiteHelper.getImage() returns a String 作为路径指向到图像,因为通常您不会将二进制数据存储在数据库中)或将 BitmapDrawable 转换为 String。这两种情况实际上都没有意义。

通常的做法是:实现一个助手 class 然后用它的实例参数化 ListView 的适配器。网上有大量示例,请查看使用数据库

this one, or that one

从错误消息来看,问题似乎出在代码的其他地方。

BitmapFactory﹕ Unable to decode stream: java.io.FileNotFoundException

这可能意味着您正在解码带有位置的文件,但该位置无效。也许您正在使用 BitmapFactory.decodeFile?

如果您使用的是 BitmapFactory,请检查您的代码,并确保您传递的位置正确(如果可用)。