2011-02-03 77 views
3

我試圖將不同的圖像(.jpg,.png)動態地從r es/drawable中移入ListView。 我從數據庫中獲取圖像的名稱。 圖像本身位於res/drawable文件夾中。動態顯示來自資源/可繪製的圖像

這是我已經有了,並帶有錯誤:d

字符串imgName; - >還有img的名字,我從數據庫中需要

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

然後我得到這個成ArrayList對數據庫中的每個圖像(+ - 200圖像):

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列是ImageViewTextView

的System.out:resolveUri失敗壞 位URI: [email protected] resolveUri失敗的壞位URI: [email protected] resolveUri失敗的壞位URI: [email protected] resolveUri失敗的壞位URI: [email protected] ... ......

我得到它的工作時,我保存的圖像到本地或SD卡存儲,然後把路徑類似的ArrayList內:

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

我不能用這個,因爲那時我就需要將圖片從res/drawable複製到本地或SD.This佔用內存的2倍。不能那樣。

必須有辦法從drawable動態獲取圖像。

任何人都知道我在這裏錯過了什麼? 謝謝。

回答

5

的SimpleAdapter期望指定資源或圖像URI的整數或字符串的該特定行:

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

由bindView()調用以設置圖像只有在沒有現有的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

夥計,你真棒!我剛剛實施了你的解決方案,它的工作原理就像一個沙盤!謝謝 !! – user601302 2011-02-03 13:24:23

1

簡單適配器需要映射中的字符串。但是你的地圖包含了關鍵「img」的drawable。

請嘗試擴展BaseAdapter類。重寫getView方法,然後手動將drawable設置爲imageview,將text設置爲textview。

另一個想法是,將每個drawable保存在內存中可能不是一個好主意。而得到被拉伸動態而呈現列表

+0

謝謝,我肯定會在將來使用baseAdapters。看起來很方便。 – user601302 2011-02-03 13:24:07

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