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.
- agregar clic Listner en cada elemento de fila en ListView
- Indexación de alfabetos en ListView .. Ignorar la indexación de secciones
- Android adapter.getItem (position) .getItemId () no funciona (El método getId () no está definido para el tipo Object)
- Android.content.res.Resources $ NotFoundException al establecer programación android.R.attr.listChoiceIndicatorMultiple
- Android ListView con RadioButton en modo singleChoice y un diseño de fila personalizado
¿Si conozco el índice del artículo, cómo fijarlo como enfocado en la exhibición?
- Android: Cómo ocultar un elemento ListView
- ¿Cómo hacer ListView personalizado con fondos de colores de los elementos?
- Cambiar el color de fondo y color de texto del elemento de fila listview en android
- Vista de la lista de android
- Cambiar dinámicamente la altura de la fila en una vista de lista basada en el número de elementos de la lista
- Cómo cambiar el color de los elementos de ListView en el enfoque y al hacer clic
- Cómo resaltar ListView-Items
- Cómo iterar elementos de ListView en Android
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; } }
- window.close equivalente en Phonegap con InAppBrowser
- android: cómo ocultar la carpeta de aparecer en la galería