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; }
}
¡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
¿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
Simplemente estoy trabajando con el emulador ahora en Eclipse. Y usando el teclado de mi PC para trabajar. – kiki