2011-09-14 1 views
13

Ho una listview con immagine.Quando seleziono ogni elemento l'immagine cambia all'immagine cliccata.Ma quando seleziono un altro elemento entrambe le immagini cambiano.Voglio solo l'elemento selezionato da cambiare l'image.it deve funzionare come un pulsante di opzione con l'opzione mode.pls a scelta singola.come impostare la modalità scelta singola per listview con immagini

public class ProvierActivity extends Activity { 
    private String text[] = { "BroadStripe-Cable (Seattle)", "BroadStripe-Digital (Seattle)", 
     "BroadStripe-Cable (Seattle)", "Comcast king county south)", "BroadStripe-Cable (Seattle)", 
     "Comcast king county south", "BroadStripe-Digital (Seattle)", "BroadStripe-Digital (Seattle)", 
     "BroadStripe-Cable (Seattle)", "Comcast king county south" }; 

    /** Called when the activity is first created. */ 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 

     final ListView list = (ListView) findViewById(R.id.listview_id); 

     list.setAdapter(new ArrayAdapter<String>(this, R.layout.list, 
      R.id.title, text)); 

     list.setOnItemClickListener(new OnItemClickListener() { 

     @Override 
      public void onItemClick(AdapterView<?> arg0, View view, 
       int position, long arg3) { 
       // TODO Auto-generated method stub 

       if (view.findViewById(R.id.img).getVisibility() == ImageView.VISIBLE) { 
        ImageView icon = (ImageView) view.findViewById(R.id.img); 

        icon.setImageResource(R.drawable.checked); 
       } 
      } 
     }); 
    } 
} 
+0

Controlla questo per riferimento futuro ** https: //www.youtube.com/watch? V = s4JwU28VMko ** –

risposta

37

La soluzione consigliata è quella di fare affidamento su un supporto integrato selezione ListView specificando modalità single-scelta per esso:

list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 

Poi si dovrebbe lasciare che il vostro articolo elenco implementare per implementare Checkable interfaccia; ciò richiede una certa personalizzazione della vista root del tuo layout. Supponendo che ha LinearLayout come una radice, un'implementazione può apparire come:

public class MyListItem extends LinearLayout implements Checkable { 

    public MyListItem(Context context, AttributeSet attrs) { 
     super(context, attrs); 
    } 

    public MyListItem(Context context) { 
     super(context); 
    } 

    private boolean checked = false; 

    private ImageView icon; 

    @Override 
    protected void onFinishInflate() { 
     super.onFinishInflate(); 
     icon = (ImageView)findViewById(R.id.img); // optimisation - you don't need to search for image view every time you want to reference it 
    } 
    @Override 
    public boolean isChecked() { 
     return checked; 
    } 

    @Override 
    public void setChecked(boolean checked) { 
     this.checked = checked; 
     if (icon.getVisibility() == View.VISIBLE) { 
      icon.setImageResource((checked) ? R.drawable.checked : R.drawable.unchecked); 
     } 
    } 

    @Override 
    public void toggle() { 
     setChecked(!checked); 
    } 
} 

Il file di layout dovrebbe essere aggiornato per fare riferimento MyListItem classe invece di LinearLayout troppo, naturalmente.

Questo può essere un approccio un po 'difficile, ma presenta vantaggi come il ripristino automatico dell'elemento controllato quando viene ricreata l'attività.

Un'altra opzione è quella di utilizzare nuovamente la modalità a scelta del lista e sovrascrivere GetView dell'adattatore di sapere se l'articolo è controllato e immagine di aggiornamento di conseguenza:

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

    final ListView list = getListView(); 
    list.setChoiceMode(ListView.CHOICE_MODE_SINGLE); 
    list.setAdapter(new ArrayAdapter<String>(this, R.layout.list_item, 
      R.id.title, text) { 
     @Override 
     public View getView(int position, View convertView, ViewGroup parent) { 
      View v = super.getView(position, convertView, parent); 
      ImageView icon = (ImageView) v.findViewById(R.id.img); 
      if (list.isItemChecked(position)) { 
       icon.setImageResource(R.drawable.checked); 
      } else { 
       icon.setImageResource(R.drawable.unchecked); 
      } 
      return v; 
     } 
    }); 
} 

Tuttavia questa versione ha alcuni problemi di prestazioni - findViewById e setImageResource sono relativamente operazioni che richiedono molto tempo, quindi dovresti prendere in considerazione l'uso della memorizzazione nella cache. Raccomando di guardare "The world of ListView" video per imparare alcuni consigli molto utili su questo widget.

Quest'ultimo approccio collega anche l'adattatore al listview che introduce un accoppiamento non necessario.

+2

Questa sarebbe stata una risposta migliore con maggiori dettagli in quanto questo sembra essere un problema molto comune. –

+0

+1 Funziona come un fascino. Grazie per averlo condiviso. – Dharmendra

+0

Bella risposta. Soluzione molto elegante Grazie! – dum4ll3

4
  1. Impostare la modalità di scelta corretta nella visualizzazione elenco. setChoiceMode in base a ciò che ti serve.
  2. Creare un selettore disegnabile per utilizzare l'immagine che si desidera, in base allo stato.
  3. Imposta il tuo selettore come sfondo.

    android:background="@drawable/your_selector" 
    

    FYI:

+1

Questa è una soluzione così elegante.La chiave per me era rendermi conto che avevo bisogno di usare 'android: background =" @ drawable/your_selector "' sull'elemento 'LinearLayout' invece di usare' android: list_selector = "@ drawable/your_selector" 'su' ListView'. –