2010-12-27 40 views
14

私は以下のXMLで定義されたリストビューを持っています。 は、ユーザーが任意の行をクリックしたときに実行時にリスト内の画像を切り替える必要があります。どうすればこれを達成できますか?どんな助けも高く評価されます。 ImageViewのクラスのおかげでAndroid:動的にListviewの画像を変更する

//list_item.xml 
<?xml version="1.0" encoding="UTF-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content"> 
<ImageView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:src="@drawable/play" 
android:id="@+id/img" 
/> 
<TextView 
android:layout_width="wrap_content" 
android:layout_height="wrap_content" 
android:gravity="center_vertical" 
android:id="@+id/txt" 
/> 
</LinearLayout> 

答えて

18

あなたはonItemClickハンドラ内で(クリックした項目のViewである)は、第2のパラメータにfindViewByIdを呼び出すことによって、アイテムのimgビューを見つけることができます。

public void onItemClick(AdapterView parentView, View clickedItemView, int pos, long id) 
{ 
    ImageView imageView = (ImageView) clickedItemView.findViewById(R.id.img); 
    // ... 
} 

EDIT:はAndroidがリストを再利用することに注意してくださいアイテムViewオブジェクト(ビューリサイクルとも呼ばれます)では、各アイテムのトグル状態を後で使用するために保存する必要があります。リストアイテムビューがリスト項目にバインドされて表示されるたびに、各アイテムのトグル状態にアクセスする必要があります。例えば

は、こちらをクリックして上の各項目の画像を切り替える活動の実施例である:

import java.util.Arrays; 
import java.util.List; 

import android.app.Activity; 
import android.content.Context; 
import android.os.Bundle; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.AdapterView; 
import android.widget.ArrayAdapter; 
import android.widget.ImageView; 
import android.widget.ListView; 

public class SO4539968TestCaseActivity extends Activity { 
    private static final List<String> ITEM_TEXTS = Arrays.asList(new String[] {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13"}); 

    private boolean[] itemToggled; 

    private class MyArrayAdapter<T> extends ArrayAdapter<T> 
    { 
     public MyArrayAdapter(Context context, int resource, int textViewResourceId, List<T> objects) { 
      super(context, resource, textViewResourceId, objects); 
     } 

     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View itemView = super.getView(position, convertView, parent); 
      ImageView imageView = (ImageView) itemView.findViewById(R.id.img); 
      imageView.setImageResource(itemToggled[position] ? R.drawable.on : R.drawable.off); 
      return itemView; 
     } 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     itemToggled = new boolean[ITEM_TEXTS.size()]; 
     Arrays.fill(itemToggled, false); 

     ListView listView = (ListView) findViewById(R.id.list_view0); 
     listView.setAdapter(new MyArrayAdapter<String>(this, R.layout.list_item, R.id.txt, ITEM_TEXTS)); 
     listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      public void onItemClick(AdapterView<?> listView, View itemView, int position, long id) { 
       itemToggled[position] = ! itemToggled[position]; 

       ImageView imageView = (ImageView) itemView.findViewById(R.id.img); 
       imageView.setImageResource(itemToggled[position] ? R.drawable.on : R.drawable.off); 
      } 
     }); 
    } 
} 

研究する重要な部分は、onItemClickコールバックとMyArrayAdaptergetViewのオーバーライドです。

AdapterクラスのgetViewメソッドは、アイテムレイアウトを拡張する役割を担います。この例では、私が最初にアイテムビューを準備するためにスーパークラスのgetViewメソッドを呼び出し、その後私は適切にアイテムのimgビューのリソースIDを設定してください:

imageView.setImageResource(itemToggled[position] ? R.drawable.on : R.drawable.off); 

も参照してください:Developing Applications for Android – Gotchas and Quirks

+0

ありがとうございました。それは私のために働いた。私はこのソリューションを非常に長い間、約1ヶ月間探していました。あなたは私を救った:D – Vivek

+0

今、私はImageviewのソースを変更することができますが、私は下にスクロールして再び来ると、イメージビューは元の元にリセットされます。なぜこうなった?手伝って頂けますか? – Vivek

+1

@Vivek:ビュー再利用の問題のように聞こえます。実際の例を追加し、アンドロイドのビューのリサイクルについて説明した優れたブログ記事にリンクしているので、私の最新の回答をご覧ください。 –

-1

使用

public void setImageResource (int resId); 

方法。

P.S.私の前の回答が不完全なようで、ここでは全体のソリューションです:

ImageView imageView = (ImageView) this.findViewById(R.id.img); 
       ((BitmapDrawable)imageView.getDrawable()).getBitmap().recycle(); 
       imageView.setImageResource(R.drawable.new_image); 
       imageView.invalidate(); 
+0

に役立つことを願っとしてよく説明し、完全なデモコードです。対応するImageViewをListViewから取得するにはどうすればよいですか? ** ImageView iv =(ImageView)view; ** OnListItemClick metodでクラスキャスト例外が発生しました。 – Vivek

+0

これは動作しますか?ImageView imageView =(ImageView)this.findViewById(R.id.img); – fiction

+1

いいえ、リストビューに40行ありますと、すべての画像が同じID(つまりimg)を保持しているとします。そのため、選択したImageViewのハンドルを一意のIDで取得することはできません。 – Vivek

1

私は動的にリストビューを生成して、「キリルキリロフ」で言うようにsetimageresourceを行うために、onclickitemイベントにバインドします。

12
listview.setOnItemClickListener(new AdapterView.OnItemClickListener(){ 

     public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, 
       long arg3) { 
      ImageView imageView=arg1.findViewById(R.id.img); 
      imageView.setImageResource(R.drawable.new_image); 

     } 

    }); 
+0

oops ..私は遅いです –

+0

問題です。私はあなたの努力に感謝します。 – Vivek

+0

お返事ありがとうございました。あなたのソリューションは本当に私を助けました。 – Vivek

0

これは簡単に実行できます。ユーザーがクリックしたリスト項目の位置を見るだけで済みます。

public class ChangeImageInListDynamically extends Activity { 
/** 
* Adapter for your data. 
*/ 
ImageAdapter adpAR; 
ArrayList<String> itemList; 
ListView mListView; 
ImageAdapter mAdapter; 

/** 
* Indicate which item is currently selected. 
* Its default selected item is '0' e.g., 1st item. 
*/ 
private int selectedPosition=0; 
@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    itemList = new ArrayList<String>(); 
    for (int i = 0; i < 11; i++) { 
     itemList.add("Item - "+i); 
    } 

    mListView = (ListView)findViewById(R.id.data_list); 

    //Initialize your adapter 
    mAdapter = new ImageAdapter(nChangeImageInListDynamically.this, itemList); 

    //set adapter to your list. 
    mListView.setAdapter(mAdapter); 

    //set list click listener. 
    mListView.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
     public void onItemClick(AdapterView<?> av, View view, int position, long id) { 
      //your image that need to change dynamically. 
      ImageView imageView = (ImageView) view.findViewById(R.id.select); 

      //position of clicked item. 
      selectedPosition=position; 

      //change image of respective image. 
      imageView.setImageResource(R.drawable.selected); 

      //notify your adapter to update your list. 
      adpAR.notifyDataSetChanged(); 
     } 
    }); 

} 

static class ViewHolder { 
    TextView title; 
    ImageView img;     
} 

/** 
* Your ImageAdapter. 
*/ 
public class ImageAdapter extends BaseAdapter { 

    ArrayList<String> dataList; 
    Context context; 

    public ImageAdapter(Context context, ArrayList<String> arrayList) { 
     this.context = context; 
     this.dataList = arrayList; 

    } 

    @Override 
    public int getCount() { 
     // TODO Auto-generated method stub 
     return dataList.size();; 
    } 

    @Override 
    public Object getItem(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

    @Override 
    public long getItemId(int position) { 
     // TODO Auto-generated method stub 
     return position; 
    } 

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

     final ViewHolder holder; 
     Log.d("posiiton ImageAdapater : ",""+position); 
     if (row == null) { 
      LayoutInflater inflater = ChangeImageInListDynamically.this.getLayoutInflater(); 
      row = inflater.inflate(R.layout.listrow, null); 

      holder = new ViewHolder(); 
      holder.title = (TextView) row.findViewById(R.id.text); 
      holder.img = (ImageView) row.findViewById(R.id.select); 
      row.setTag(holder); 
     } else { 
      holder = (ViewHolder) row.getTag(); 
     } 

     //set titel text. 
     holder.title.setText(dataList.get(position)); 

     //Change Image of selected item dynamically. 
      if(selectedPosition == position) { 
       //Item is selected. 
       holder.img.setImageResource(R.drawable.selected); 

      }else{ 
       //Other non-selected items. 
       holder.img.setImageResource(R.drawable.dis_selected); 

      } 

     return row; 

    } 

} 

} 

below_私はこれがここでの問題はImageViewのを取得しているすべての:)

関連する問題