2010-10-08 11 views
15

Un'attività ha un pulsante e un controllo ListView. Inizialmente, solo il pulsante è visibile. Quando viene premuto il pulsante, viene visualizzato il ListView. Quando è visualizzato, è possibile per me mostrare una particolare voce come selezionata/focalizzata?Android: per impostare un elemento come selezionato quando si apre ListView?

Un caso d'uso potrebbe essere quello supponendo che sia un elenco di impostazioni della lingua e quando l'elenco si apre, la lingua attualmente selezionata deve essere mostrata come evidenziata.

Se conosco l'indice dell'articolo, come impostarlo come messo a fuoco sul display?

risposta

15

In breve, ListView :: setSelection (posizione int) è quello che ti serve. Tuttavia, a seconda che il dispositivo sia in modalità touch o no, potrebbe o meno avere un effetto visivo (evidenziazione in background). Per maggiori dettagli, fare riferimento a Android ListView Selection Problem

+1

No, setSelection (pos) non risolve il mio problema! Il dispositivo non è in modalità touch, ma non riesco ancora a evidenziare il backgound. Sto semplicemente testando un emulatore. La mia visualizzazione elenco utilizza un selettore xml, spero che non abbia alcun effetto su questo! – kiki

+0

Come sai che il tuo dispositivo non è in modalità touch? Forse puoi provare a utilizzare il tasto di navigazione per evidenziare il pulsante e utilizzare il tasto centrale per premere il pulsante. Vedi se questo fa la differenza. – onlygo

+0

Sto semplicemente lavorando con l'emulatore ora in Eclipse. E usando la tastiera del mio PC con cui lavorare. – kiki

11

Se si utilizza un Adapter per il vostro ListView aggiungere questo codice al vostro adattatore:

public class MyAdapter extends ArrayAdapter<MyClass> { 
    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      LayoutInflater inflator = (LayoutInflater) getContext() 
        .getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      rowView = inflator.inflate(R.layout.my_adapter, null); 
     } else { 
      rowView = (View) convertView; 
     } 

     //... 

     // set selected item 
     LinearLayout ActiveItem = (LinearLayout) rowView; 
     if (position == selectedItem){ 
      ActiveItem.setBackgroundResource(R.drawable.background_dark_blue); 

      // for focus on it 
      int top = (ActiveItem == null) ? 0 : ActiveItem.getTop(); 
      ((ListView) parent).setSelectionFromTop(position, top); 
     } 
     else{ 
      ActiveItem.setBackgroundResource(R.drawable.border02); 
     }  
    } 

    private int selectedItem; 

    public void setSelectedItem(int position) { 
     selectedItem = position; 
    }  
} 

Nel vostro Activity:

myAdapter.setSelectedItem(1); 
+0

Works great buddy –

37

ho posto la mia soluzione, perché google continua a non sapere la risposta.

getListView().setItemChecked(selectedGroupIndex, true); 
+0

vota +1 per accettare questo post come risposta, invece di setSelection – radistao

+1

Questo non funziona per me, potresti elaborarlo per favore? È ancora rilevante nel 2018? –

0

Sto usando un adattatore e non volevo impostare i colori di sfondo personalizzate, ma utilizzare l'androide: state_selected in XML drawable. SetSelection non ha funzionato per me, ma forse è anche perché avevo bisogno di SetNotifyDataChanged che mostra che lo stato selezionato non è persistente.

Ho anche riscontrato che lo stato selezionato per un elemento in un controllo ListView non è persistente, poiché SetNotifyDataChanged comporta l'aggiornamento del layout ListView che cancella tutti. Anche l'impostazione dell'elemento su Selected in GetView dell'adapter è troppo presto.

Eventualmente imposto lo stato Selezionato per la visualizzazione dell'elemento selezionato dopo che è stato modificato il layout di listview, ovvero quando viene attivato l'evento LayoutChange (in Java probabilmente si collega a OnLayoutChangeListener di ListView).

Per semplificare la memoria, memorizzo la vista dell'elemento selezionato come SelectedItemView dell'adapter. Nel gestore di eventi LayoutChange di ListView ho appena impostato la proprietà SelectedItemView dell'adapter.Selected su true.

Ecco il codice della mia attività in cui ho impostato l'adattatore per il ListView e anche iscriversi a LayoutChange (o in Java allegare un OnLayoutChangeListener)

 ringTonesListView.Adapter = ringTonesListAdapter; 
     ringTonesListView.LayoutChange += (s, layoutChangeArgs) => { 
      //At this stage the layout has been updated and the Selected can be set to true for the view of the selected item. This will result in android:state_selected logic to be applied as desired and styling can be completely done per layout in Resources. 
      ringTonesListAdapter.SelectedItemView.Selected = true; 
     }; 

Ecco il mio codice per l'adattatore:

public class RingTonesListAdapter : BaseAdapter<RingToneItem> 
{ 
    List<RingTone> Items { get; set; } 

    public override View GetView(int position, View convertView, ViewGroup parent) 
    { 
     View view = convertView; 

     // re-use an existing view, if one is available 
     // otherwise create a new one 
     if (view == null) 
     { 
      view = Context.LayoutInflater.Inflate(Resource.Layout.AlertSoundItem, parent, false); 
      view.Click += SelectRingTone; 
     } 

     RingTone ringTone = this[position]; 
     if (ringTone.Selected) 
     { 
      //==> Important 
      //Store this view since it's the view for the Selected Item 
      SelectedItemView = view; 
      //Setting view.Selected to true here doesn't help either, since Selected will be cleared after. 
     } 

     return view; 
    } 

    private void SelectRingTone(object sender, EventArgs args) 
    { 
     View view = (View)sender; 
     string title = view.FindViewById<TextView>(Resource.Id.ringToneTitle).Text; 
     RingToneItem ringToneItem = Items.First(rt => rt.Title == title); 
     if (!ringToneItem.Selected) 
     { 
      //The RingTone was not selected and is selected now 
      //Deselect Old and Select new 
      foreach (RingToneItem oldItem in Items.Where(rt => rt.Selected)) 
      { 
       oldItem.Selected = false; 
      } 

      // Select New RingTone 
      ringToneItem.Selected = true; 
      //Update the ListView. 
      //This will result in removal of Selected state for all Items when the ListView updates it's layout 
      NotifyDataSetChanged(); 
     } 

     //Now play the test sound 
     NotifierService.TestSound(Context, ringToneItem); 
    } 

    public View SelectedItemView { get; set; } 
} 
Problemi correlati