2010-10-08 4 views
15

У объекта есть кнопка и список. Первоначально отображается только кнопка. Когда кнопка нажата, отображается ListView. Когда отображается, возможно ли, чтобы я отобразил один конкретный элемент, выбранный/сфокусированный?Android: Чтобы установить элемент, выбранный при открытии списка ListView?

Может быть использован прецедент, который предполагает, что это список языковых настроек, и когда список открывается, выбранный язык должен быть выделен как выделенный.

Если я знаю индекс элемента, как установить его как сфокусированный на дисплее?

ответ

15

Одним словом, ListView :: setSelection (int position) - это то, что вам нужно. Однако, в зависимости от того, находится ли устройство в касании или нет, оно может иметь или не иметь визуальный эффект (выделение фона). Для получения более подробной информации, обратитесь к Android ListView Selection Problem

+1

Нет, setSelection (pos) не решает мою проблему! Устройство не находится в режиме касания, но все же я не получаю подсветку. Я просто тестирую эмулятор. В моем представлении списка используется селектор xml, надеюсь, что это не повлияет на это! – kiki

+0

Откуда вы знаете, что ваше устройство не находится в режиме касания? Возможно, вы можете попытаться использовать навигационную клавишу, чтобы выделить кнопку и использовать центральную клавишу, чтобы нажать кнопку. Посмотрите, если это имеет значение. – onlygo

+0

Я просто работаю с эмулятором сейчас в Eclipse. И с помощью клавиатуры моего ПК для работы. – kiki

11

Если вы используете Adapter для вашего ListView добавить этот код адаптера:

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; 
    }  
} 

В вашем Activity:

myAdapter.setSelectedItem(1); 
+0

Работы отличные друзья –

37

я отправляю мое решение, потому что Google еще не знает ответа.

getListView().setItemChecked(selectedGroupIndex, true); 
+0

проголосовать +1, чтобы принять это сообщение в качестве ответа, а не setSelection – radistao

+1

Это не работает для меня, не могли бы вы уточнить, пожалуйста? Это все еще актуально в 2018 году? –

0

Я использую адаптер и не хочу, чтобы установить пользовательский цвета фона, но использовать 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; } 
} 
Смежные вопросы