Android: ¿Para establecer un elemento como seleccionado cuando se abre ListView?

Una actividad tiene un botón y un ListView. Inicialmente, sólo el botón es visible. Cuando se presiona el botón, se visualiza ListView. Cuando se muestra, ¿es posible que muestre un elemento determinado como seleccionado / enfocado?

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

¿Si conozco el índice del artículo, cómo fijarlo como enfocado en la exhibición?

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 efecto visual (resaltado de fondo). Para obtener más información, consulte Android ListView Selection Problem

Puedo publicar mi solución, porque google todavía no sabe la respuesta.

getListView().setItemChecked(selectedGroupIndex, true); 

Si utiliza un Adapter para su ListView agregue 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); 

Estoy usando un adaptador y no quería establecer colores de fondo personalizados, pero usar el androide: state_selected en xml extraíble. SetSelection no funcionó para mí, pero tal vez eso también es desde que necesitaba SetNotifyDataChanged que muestra que el Estado seleccionado no es persistente.

También encontré que el estado seleccionado para un artículo en un ListView no es persistente, ya que SetNotifyDataChanged resultados en la actualización del diseño ListView que los borra todos. Configurar el elemento a Selected en el GetView del adaptador es demasiado pronto.

Finalmente, establezco el estado Seleccionado para la vista del elemento seleccionado después de que se haya cambiado el diseño de la vista de lista, que es cuando se desencadena el evento LayoutChange (en Java es probable que adjunte a OnLayoutChangeListener de ListView).

Para que sea realmente fácil almacenar la vista del elemento seleccionado como SelectedItemView del adaptador. En el gestor de eventos LayoutChange del ListView sólo establezco SelectedItemView.Selected del adaptador a true.

Aquí está el código de mi actividad donde yo fijé el adaptador para el ListView y también suscribir a LayoutChange (o en Java atar 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; } } 
  • Buggy ListView me hace triste
  • Cómo arrastrar el elemento de lista desplegable a otro ListView
  • Cómo cargar elementos en el widget de vista de lista de inicio de android?
  • Android ListView con diferentes diseños para cada fila
  • Problema al seleccionar el color del selector ListView cuando se pulsa
  • Android: ¿Obtener la altura del elemento ListView?
  • Listview error: "Su contenido debe tener un ListView cuyo atributo id es 'android.R.id.list'"
  • Haga clic en un elemento ListView cambia el estado de los elementos dentro del elemento?
  • Cómo definir ColorStateList para TextView?
  • Android listview viewholder. Cuándo usarlo, y cuándo no
  • Separadores ListView con un CursorAdapter
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.