【问题标题】:Dynamically show images from resource/drawable动态显示资源/可绘制的图像
【发布时间】:2011-02-03 11:20:12
【问题描述】:

我正在尝试将不同的图像(.jpg、.png)动态地放入来自 res/drawableListView 中。 我从数据库中获得的图像中的名称。 图片本身位于res/drawable 文件夹中。

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

字符串 imgName; --> 数据库中有我需要的img名称

Drawable drawable;    
    drawable = Class.appContext.getResources().getDrawable(Class.appContext.getResources().getIdentifier("com.example.test:drawable/"+imgName,null,null));  

然后我为数据库中的每张图片(+- 200 张图片)将其放入 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);

现在我返回列表;

在我打电话的班级里:

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);

XML 行是一个ImageView 和一个TextView

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

当我将图像保存到本地或 SD 卡内存中时,它就可以工作了,然后将路径放在 arraylist 中,例如:

map.put("img","/data/data/com.example.test/images/" + imgName);

我不能使用它,因为我需要将图片从res/drawable 复制到本地或 SD。这占用了 2 倍的内存。不能有那个。

必须有一种方法可以从可绘制对象中动态获取图像。

有人知道我在这里缺少什么吗? 谢谢。

【问题讨论】:

    标签: android listview uri dynamic drawable


    【解决方案1】:

    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

    【讨论】:

    • 哥们,你太棒了!!我刚刚实施了您的解决方案,它就像一个沙姆!谢谢!!
    • 非常感谢您对 setViewValue 应该返回什么的解释!
    • @LA_ - 我很高兴我的回答很有帮助。感谢您的反馈。
    【解决方案2】:

    简单的适配器需要映射中的字符串。但是您的地图包含键“img”的可绘制对象。

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

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

    【讨论】:

    • 谢谢,我以后肯定会使用baseAdapters。看起来很方便。
    【解决方案3】:

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

    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);
    

    【讨论】:

      猜你喜欢
      • 2011-09-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-19
      • 2018-02-07
      • 1970-01-01
      相关资源
      最近更新 更多