2012-05-06 62 views
1

我有一個ListView,它有兩個TextViews。我試圖動態地將背景圖像設置爲TextViews之一。根據每個項目/行的類別,我要顯示大約18個不同的圖像。圖像被命名爲"abc1""abc2",等這裏是我的自定義CursorAdapter代碼:來自ListView/row的TextView上的動態背景圖像

private class MyListAdapter extends SimpleCursorAdapter { 

    public MyListAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to) { 
     super(context, layout , cursor, from, to); 
    } 

    @Override 
    public void bindView(View view, Context context, Cursor cursor) { 

     // Get the resource name and id 
     String resourceName = "R.drawable.abc" + cursor.getString(7); 
     int resid = context.getResources().getIdentifier(resourceName,"drawable",context.getPackageName()); 

     // Create the idno textview with background image 
     TextView idno = (TextView) view.findViewById(R.id.idno); 
     idno.setText(cursor.getString(3)); 
     idno.setBackgroundResource(resid); 

     // create the material textview 
     TextView materials = (TextView) view.findViewById(R.id.materials); 
     materials.setText(cursor.getString(1)); 
    } 
} 

當我在調試運行它,resid總是返回0這表明資源沒有被發現。 resourceName看起來正確,ID:"R.drawable.abc1"。我將圖像文件導入到res/drawable文件夾中,並將它們列入R.java

這是正確的方式去做這件事還是有人有更好的解決方案嗎?

回答

1

您不使用全名,例如R.drawable.abc1,您只使用drawable後的名稱。 getIdentifier()的工作是從name,typepackage建立正確的String。因此,使用getIdentifier()應該是:

String resourceName = "abc" + cursor.getString(7); 
int resid = context.getResources().getIdentifier(resourceName,"drawable",context.getPackageName()); 

此外,你應該看看設置圖片爲背景的另一種方法,因爲getIdentifier()是慢得多的執行方法,它會在bindView回調被稱爲隨着用戶上下滾動ListView(有時用戶可以以非常快的速度執行此操作),這可能會被稱爲很多次。

編輯:

一個可以使用的方式getIdentifier更有效地是初始化在定製CursorAdapter和存儲的ID在HashMap<Integer, Integer>出現在名稱中的數字之間的映射(ABC ,ABC 等)和實際的ID:

private HashMap<Integer, Integer> setUpIdsMap() { 
    HashMap<Integer, Integer> mapIds = new HashMap<Integer, Integer>(); 
    // I don't know if you also have abc0, if not use this and substract 1 from the cursor value you get 
    for (int i = 0; i < 18; i++) { 
     String resourceName = "abc" + 0; 
     int resid =  context.getResources().getIdentifier(resourceName,"drawable",context.getPackageName()); 
     mapIds.put(i, resid); 
    } 

}

在適配器的構造:

//...field in your adapter class 
    HashMap<Integer, Integer> ids = new HashMap<Integer, Integer>(); 

//in the constructor: 
//... 
    ids = setUpIdsMap(); 
//... 

然後在bindView方法使用返回的數組由:

//... 
// Create the idno textview with background image 
     TextView idno = (TextView) view.findViewById(R.id.idno); 
     idno.setText(cursor.getString(3)); 
     idno.setBackgroundResource(ids.get(cursor.getString(7)));//depending if you have abc0 or not you may want to substract 1 from cursor.getString(7) to match the value from the setUpIdsMap method 
//... 
+0

感謝您的答覆!我意識到,「R.drawable」可能是不必要的,因爲您必須傳遞哪些資源才能獲得:「drawable」。現在完美感覺! – wyoskibum

+0

我將探索hashmap,但我必須手動初始化地圖,因爲數字必然是連續的。每條記錄的類別可以是1,即abc1,也可以是1.1,即abc11。 再次感謝。 – wyoskibum