从resource / drawable动态显示图像

时间:2011-02-03 11:20:13

标签: android listview uri dynamic drawable

我正在尝试将不同的图片(.jpg,.png)动态地放入来自r ListView的{​​{1}}。 我从数据库中获取的图像中的名称。 图像本身位于es/drawable文件夹中。

这就是我已经拥有的,错误是:D

String imgName; - >我需要从数据库中获取img名称

res/drawable

然后我为数据库中的每个图像(+ - 200张图像)将其变为Drawable drawable; drawable = Class.appContext.getResources().getDrawable(Class.appContext.getResources().getIdentifier("com.example.test:drawable/"+imgName,null,null));

ArrayList

现在我返回列表;

在我打电话的班级中:

ArrayList<HashMap<String, Object>> list = new ArrayList<HashMap<String, Object>>();
HashMap<String, Object> map = new HashMap<String, Object>();

map = new HashMap<String, Object>();
map.put("img",drawable);

          map.put("text", "some text");
          list.add(map);

XML行是listReceive = Class.getImages(appContext); listSetup = new SimpleAdapter(this, listReceive, R.layout.row, new String[] {"img", "text"}, new int[] {R.id.IMG_CELL, R.id.TEXT_CELL}); lvList.setAdapter(listSetup); ImageView

  

System.out:resolveUri失败了   位图uri:   android.drawable.bitmapDrawable@405739   在坏位图uri上resolveUri失败:   android.drawable.bitmapDrawable@405639   在坏位图uri上resolveUri失败:   android.drawable.bitmapDrawable@405959   在坏位图uri上resolveUri失败:   android.drawable.bitmapDrawable@405677 ...   ......

当我将图像保存到本地或SDcard内存中时,我将其工作,然后将路径放在arraylist中,如:

TextView

我无法使用它,因为我需要将图片从map.put("img","/data/data/com.example.test/images/" + imgName); 复制到本地或SD.This占用内存的2倍。不能有那个。

必须有一种从drawable动态获取图像的方法。

任何人都知道我在这里缺少什么? 感谢。

3 个答案:

答案 0 :(得分:5)

SimpleAdapter需要一个指定资源或图像URI的整数或字符串:

public void setViewImage (ImageView v, String value)
Since: API Level 1
  

由bindView()调用以设置ImageView的图像,但仅当没有现有的ViewBinder或现有的ViewBinder无法处理与ImageView的绑定时。 默认情况下,该值将被视为图像资源。如果该值不能用作图像资源,则该值将用作图像Uri。 如果提供的数据不是int或Integer,则调用此方法而不是setViewImage(ImageView,int)

我认为应该使用setViewBinderSimpleAdapter提供ViewBinder来处理Drawable数据与ImageView的绑定。基本上,setViewValue()方法应返回false,除非为图像视图调用它。当为图像视图调用它时,该方法应在视图中设置数据并返回true。返回值指示ViewBinder是否能够设置视图或适配器是否应尝试通过其默认行为绑定数据本身。

可能是这样的:

private final SimpleAdapter.ViewBinder mViewBinder =
    new SimpleAdapter.ViewBinder() {
        @Override
        public boolean setViewValue(
                final View view,
                final Object data,
                final String textRepresentation) {

            if (view instanceof ImageView) {
                ((ImageView) view).setImageDrawable((Drawable) data);
                return true;
            }

            return false;
        }
    };

...

listSetup .setViewBinder(mViewBinder);

我使用SimpleCursorAdapter及其ViewBinder完成了similar thing

答案 1 :(得分:1)

简单的适配器需要地图中的String。但是你的地图包含一个关键字“img”的drawable。

而是尝试扩展BaseAdapter类。覆盖getView方法,然后手动将drawable设置为imageview,将text设置为textview。

另一个想法是,将每个可绘制的内容保留在内存中可能不是一个好主意。而是在渲染列表的特定行时动态获取可绘制的

答案 2 :(得分:0)

以下方法或方法也适用 - 如果有人仍然感兴趣

List<HashMap<String, String>> list = new ArrayList<HashMap<String, String>>();
Integer flags[] = new Integer[listdetail.size()];
Resources resources = getResources();
for (int i = 0; i < listdetail.size(); i += 2) {
    listName = listdetail.get(i).getName();
    int dynamicId = resources.getIdentifier(listdetail.get(i).getName().replaceAll(" ", "").toLowerCase(), "drawable", getActivity().getPackageName());
    if(dynamicId == 0) {
        dynamicId = R.drawable.test_image;
        flags[i] = dynamicId;
    }else {
        flags[i] = dynamicId;
    }
    HashMap<String, String> hm = new HashMap<String, String>();
    hm.put("value1", listdetail.get(i).getName());
    hm.put("valueImage1", Integer.toString(flags[i]));
    list.add(hm);
}

String[] from = { "value1", "valueImage1"};
int[] to = { R.id.textview, R.id.imageView };
SimpleAdapter adapter = new SimpleAdapter(getActivity().getBaseContext(), list, R.layout.listlayout, from, to);

ListView listView = (ListView) getActivity().findViewById(R.id.listview);
listView.setAdapter(adapter);