2010-12-27 10 views
14

Ho un listview definito dal seguente xml. Ho bisogno di attivare l'immagine nell'elenco durante il runtime quando l'utente fa clic su qualsiasi riga. Come posso raggiungere questo obiettivo? Qualsiasi aiuto è molto apprezzato. GrazieAndroid: modifica dinamicamente l'immagine in 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> 

risposta

18

È possibile individuare img vista dell'elemento chiamando findViewById sul secondo parametro (che è il View dell'elemento cliccato) all'interno della onItemClick gestore:

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

EDIT: Essere consapevoli del fatto che Android riutilizza lista item View oggetti (chiamati anche view recycling), quindi lo stato di attivazione di ogni elemento deve essere memorizzato per un uso successivo. È necessario accedere allo stato di attivazione/disattivazione di ogni elemento ogni volta che una vista di una voce di elenco è associata a una voce di elenco per la visualizzazione.

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

Le parti importanti per lo studio sono la onItemClick richiamata e l'override di getView in MyArrayAdapter:

Per esempio, qui è esempio di un'attività che alterna l'immagine di ogni elemento al clic di lavoro.

Il metodo getView della classe Adapter è responsabile del gonfiaggio del layout dell'articolo. In questo esempio, chiamo il metodo della superclasse per preparare inizialmente vista elementi getView, ma poi faccio in modo di impostare in modo appropriato l'ID di risorsa della img vista dell'elemento:

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

Vedi anche: Developing Applications for Android – Gotchas and Quirks

+0

Grazie mille. Ha funzionato per me. Stavo cercando questa soluzione per un tempo molto lungo, circa un mese. Mi hai salvato: D – Vivek

+0

Ora, sono in grado di modificare la sorgente della vista di anteprima, ma quando scorro di seguito e torno di nuovo, la visualizzazione di immagini viene reimpostata alla sorgente precedente. Perché sta succedendo? Mi potete aiutare? – Vivek

+1

@Vivek: Sembra un problema di riutilizzo della vista. Si prega di vedere la mia risposta aggiornata perché ho aggiunto un esempio funzionante e ho collegato a un post del blog eccellente che descrive il riciclo delle visualizzazioni di Android. –

-1

Usa

public void setImageResource (int resId); 

metodo della classe ImageView.

P.S. La mia risposta precedente sembra incompleto, qui è l'intera soluzione:

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

Qui il problema è sempre l'ImageView. Come ottengo il corrispondente ImageView dal ListView? Quando eseguo ** Visione di ImageView iv = (ImageView); ** nel metodo OnListItemClick ottengo un'eccezione di classe cast. – Vivek

+0

Funziona - ImageView imageView = (ImageView) this.findViewById (R.id.img); – fiction

+1

No. Perché, supponiamo che se ho 40 righe nella mia lista, tutte le immagini manterranno lo stesso ID (ad esempio img). Quindi non possiamo ottenere l'handle di ImageView selezionato con ID univoco. – Vivek

1

io generare dinamicamente ListView e quindi associare all'evento onclickitem, al fine di fare il setimageresource come dire da 'Kiril Kirilov'.

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 .. sono in ritardo –

+0

Non importa. Apprezzo il tuo sforzo. – Vivek

+0

Grazie mille per la risposta. La tua soluzione mi ha davvero aiutato. – Vivek

0

Questo può essere fatto facilmente, è sufficiente osservare la posizione dell'elemento di elenco su cui è stato fatto clic per utente. Un codice demo completo ben descritta è come below_

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; 

    } 

} 

} 

Spero che questo vi aiuterà a tutti :)

Problemi correlati