2012-02-09 4 views
0

drawableからmy listviewに画像を追加する方法が不思議です。私はデータベースから取得する2つのTextViews(id、activity)を持つListViewを持っています。あなたは私にいくつかのアドバイスを与えることができる?:)drawableから画像を追加する方法ListViewをデータベースから取り込む

を私は活性値に依存TextViewの横に画像を表示したい

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

でデータを取っています。あなたがSimpleCursorAdapterを拡張して、coumpund絞り可能としてあなたのTextViewのための画像を設定するには、GetViewメソッドをオーバーライドし、独自のアダプタを作成する必要が

よろしく

答えて

2

。続き

は一例ですが、あなたがあなた自身の方法でそれを使用することができます。

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

+0

@ user1199476あなたが正しい答えを得た場合は、それをチェックしてください。それは将来の使用のために参考になります。 –

2

私が正しくあなたの質問を理解している場合、1つの解決策は、このように、あなたのレイアウトで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はリソースIDを持つテーブルの列で、R.id.symbolはImageViewのIDです。次に、SimpleCursorAdapter.ViewBinderインターフェイスを実装し、実装をカーソルアダプタに設定する必要があります。

例を見る前に、考慮すべき点が1つあります。Tracks.SYMBOLというカーソルの列は、R.drawableクラスの目的のリソースフィールドと等しい値の整数を持つことができます。これらのフィールドは自動的に生成されるので便利ではないので、そのフィールドの値を制御することはできません。 1つの解決策は、クラスフィールド名でStringを格納し、フィールド値を取得するためにリフレクションを使用することです。ここ

は、以前に定義されたアダプタに接続され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プログラミングを始めたばかりです。私はあるプロジェクトでそういったことをして、うまくいった。私は簡単な方法があるかどうかわかりません。

よろしくお願いいたします。

関連する問題