Я использую адаптер и не хочу, чтобы установить пользовательский цвета фона, но использовать Android: State_Selected в вытяжке XML. SetSelection не работал для меня, но, возможно, это также потому, что мне нужен SetNotifyDataChanged, который показывает, что выбранное состояние не является постоянным.
Я также обнаружил, что состояние Selected для элемента в ListView не является постоянным, поскольку SetNotifyDataChanged приводит к обновлению макета ListView, который очищает их все. Слишком скоро установка элемента в Выбранный в GetView адаптера слишком скоро.
В конце концов я устанавливаю состояние Selected для просмотра выбранного элемента после того, как была изменена компоновка списка, т.е. когда событие LayoutChange запускается (в Java это, вероятно, связано с OnLayoutChangeListener ListView).
Чтобы сделать это очень просто, я сохраняю представление выбранного элемента как SelectedItemView адаптера. В обработчике событий LayoutChange ListView я просто установил значение SelectedItemView адаптера в true.
Вот код из моей деятельности, где я установил адаптер для ListView, а также подписаться на LayoutChange (или в Java подсоединять 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;
};
Вот мой код адаптера:
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; }
}
Нет, setSelection (pos) не решает мою проблему! Устройство не находится в режиме касания, но все же я не получаю подсветку. Я просто тестирую эмулятор. В моем представлении списка используется селектор xml, надеюсь, что это не повлияет на это! – kiki
Откуда вы знаете, что ваше устройство не находится в режиме касания? Возможно, вы можете попытаться использовать навигационную клавишу, чтобы выделить кнопку и использовать центральную клавишу, чтобы нажать кнопку. Посмотрите, если это имеет значение. – onlygo
Я просто работаю с эмулятором сейчас в Eclipse. И с помощью клавиатуры моего ПК для работы. – kiki