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; }
}
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
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
Sto semplicemente lavorando con l'emulatore ora in Eclipse. E usando la tastiera del mio PC con cui lavorare. – kiki