2010-10-08 30 views
15

Una actividad tiene un botón y un ListView. Inicialmente, solo el botón está visible. Cuando se presiona el botón, se muestra ListView. Cuando se muestra, ¿es posible para mí mostrar un elemento en particular como seleccionado/enfocado?Android: ¿Para establecer un elemento como seleccionado cuando se abre ListView?

Un caso de uso podría ser que suponga que es una lista de configuraciones de idioma y cuando se abre la lista, el idioma seleccionado actualmente debe aparecer resaltado.

Si conozco el índice del artículo, ¿cómo establecerlo como centrado en la pantalla?

Respuesta

15

En resumen, ListView :: setSelection (int position) es lo que necesita. Sin embargo, dependiendo de si el dispositivo está en modo táctil o no, puede o no tener un efecto visual (resaltado de fondo). Para más detalles, consulte Android ListView Selection Problem

+1

¡No, setSelection (pos) no resuelve mi problema! El dispositivo no está en modo táctil, pero aún así no obtengo el resaltado de fondo. Simplemente estoy probando un emulador. Mi vista de lista usa un selector xml, ¡espero que no tenga ningún efecto sobre esto! – kiki

+0

¿Cómo sabes que tu dispositivo no está en modo táctil? Tal vez puedas tratar de usar la tecla de navegación para resaltar el botón y usar la tecla central para presionar el botón. A ver si eso hace la diferencia. – onlygo

+0

Simplemente estoy trabajando con el emulador ahora en Eclipse. Y usando el teclado de mi PC para trabajar. – kiki

11

Si utiliza un Adapter para su ListView añadir este código a su adaptador:

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

En su Activity:

myAdapter.setSelectedItem(1); 
+0

Funciona muy bien amigo –

37

he puesto mi solución, porque google todavía no sabe la respuesta.

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

voto +1 para aceptar esta publicación como respuesta, en lugar de setSelection – radistao

+1

Esto no funciona para mí, ¿podría elaborarlo por favor? ¿Sigue siendo relevante en 2018? –

0

estoy usando un adaptador y no quería establecer los colores de fondo personalizadas, pero utilizar el androide: STATE_SELECTED en XML estirable. SetSelection no funcionó para mí, pero tal vez sea también porque necesitaba SetNotifyDataChanged, que muestra que el Estado seleccionado no es persistente.

También encontré que el estado Seleccionado para un elemento en un ListView no es persistente, ya que SetNotifyDataChanged da como resultado la actualización del diseño de ListView que los borra a todos. Establecer el elemento en Seleccionado en GetView del Adaptador también es demasiado pronto.

Eventualmente configuré el estado Seleccionado para la vista del elemento seleccionado después de que se modificó el diseño de la vista de lista, que es cuando se activa el evento LayoutChange (en Java, probablemente está adjuntando a OnLayoutChangeListener de ListView).

Para hacerlo realmente fácil, almaceno la vista del artículo seleccionado como SelectedItemView del Adaptador. En el controlador de eventos LayViewChange de ListView, establecí el SelectedItemView.Selected del adaptador en verdadero.

Aquí está el código de mi actividad en la que me puse el adaptador para el ListView y también suscribirse a LayoutChange (o en Java adjuntar 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; 
     }; 

Aquí está mi código para el adaptador:

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; } 
} 
Cuestiones relacionadas