2012-02-09 114 views
0

我想知道如何將圖像從drawable添加到我的列表視圖中。我有ListView與兩個TextViews(id,活動),我從數據庫中檢索。你能給我一些建議嗎?:)如何將圖像添加到ListView從數據庫中填充

我與

 SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
      R.layout.history_list_item, cursor, new String[] { Tracks._ID, 
        Tracks.ACTIVITY }, new int[] { R.id.id, R.id.activity }); 

我想旁邊顯示依賴於活動值TextView的攝像數據。

問候

回答

2

你需要編寫自己的適配器延伸SimpleCursorAdapter,然後覆蓋getView方法,爲您的TextView作爲coumpund抽拉設置圖像。

下面只是一個例子,但是你可以用它自己的方式:

private class NotesListAdapter extends ArrayAdapter<Note>{ 
     public NotesListAdapter() { 
      super(getBaseContext(), R.layout.list_note_row, R.id.noteHead, notes); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      ViewHolder holder = null; 

      if(convertView == null){ 
       LayoutInflater inflater = getLayoutInflater(); 
       convertView = inflater.inflate(R.layout.list_note_row, parent, false); 

       holder = new ViewHolder(); 
       holder.txtHeading = ((TextView)convertView.findViewById(R.id.noteHead)); 
       holder.txtContent = ((TextView)convertView.findViewById(R.id.noteBody)); 
       holder.image = ((ImageView)convertView.findViewById(R.id.note_icon)); 

       convertView.setTag(holder); 
      } 
      else 
       holder = (ViewHolder) convertView.getTag(); 

      //set texts 
      holder.txtHeading.setText("bla bla"); 
      holder.txtHeading.setCompoundDrawables(getResources().getDrawable(R.drawable.app_icon), null, null, null); 
      holder.txtContent.setText("bla bla"); 

      return convertView; 
     } 
} 

//this is better approach as suggested by Google-IO for ListView 
    static class ViewHolder{ 
     TextView txtHeading; 
     TextView txtContent; 
     ImageView image; 
    } 
+0

謝謝你的快速回答,我會用它:) – user1199476 2012-02-09 11:30:31

+0

@ user1199476如果你有正確的答案只是打勾它。它爲未來的使用提供參考。 – 2012-09-28 10:25:09

2

如果我正確理解你的問題,一個解決辦法是在您的佈局中的ImageView的,就像這樣:

SimpleCursorAdapter adapter = new SimpleCursorAdapter(this, 
     R.layout.history_list_item, cursor, new String[] { Tracks.SYMBOL, 
       Tracks._ID, Tracks.ACTIVITY }, 
       new int[] { R.id.symbol, R.id.id, R.id.activity }); 

在上面的代碼中,Tracks.SYMBOL是具有資源標識的表列,而R.id.symbol是ImageView的標識。然後你必須實現SimpleCursorAdapter.ViewBinder接口並將你的實現設置到遊標適配器中。

在我們看到一個示例之前,我們需要考慮一下:遊標列Tracks.SYMBOL可以具有與R.drawable類中所需資源字段相同值的整數。這是不方便的,因爲這些字段是自動生成的,因此不會讓我們控制它們的值。一種解決方案是使用類字段名稱存儲字符串並使用反射來獲取字段值。

這裏是一個ViewBinder的一個例子被附接到所述先前定義的適配器:

與setViewValue方法
adapter.setViewBinder(new SimpleCursorAdapter.ViewBinder() { 

    @Override 
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) { 
     boolean binded = false; 
     if (view instanceof ImageView) { 
      int resourceId R.drawable.default_img; 
      String image = cursor.getString(columnIndex).trim(); 
      try { 
       resourceId = R.drawable.class.getField(image).getInt(null); 
      } catch (NoSuchFieldException e) { 
      } 
      ((ImageView) view).setImageResource(resourceId); 
      binded = true; 
     } 
     return binded; 
    } 
}); 

的一點是,如果它返回false,則SimpleCursorAdapter將執行的方式它通常的結合確實。但是,如果該方法返回true,則SimpleCursorAdapter會認爲該作業已完成,並且不會嘗試再綁定該字段。

我剛開始使用Android編程。我在一個項目中做了這樣的事情,它運行良好。我不知道是否有更簡單的方法。

此致敬禮。