2012-04-03 3 views
3

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

Мой код это выглядит следующим образом:

protected void onResume() { 
... 
ListView lv = getListView(); 
lv.setOnItemSelectedListener(new OnItemSelectedListener() 
{ 
    public void onItemSelected(AdapterView<?> adapterView, View view, int pos, long id) { 
     Log.v(TAG, "onItemSelected(..., " + pos + ",...) => selected: " + getSelectedItemPosition()); 
    } 
    public void onNothingSelected(AdapterView<?> adapterView) { 
     Log.v(TAG, "onNothingSelected(...) => selected: " + getSelectedItemPosition()); 
    } 
}); 
lv.setOnItemClickListener(new OnItemClickListener() 
{ 
    public void onItemClick(AdapterView<?> adapterView, View view, int pos, long id) { 
     lv.setSelection(pos);    
     Log.v(TAG, "onItemClick(..., " + pos + ",...) => selected: " + getSelectedItemPosition());    
    } 
}); 
... 
} 

Когда я запускаю это и нажмите например, по второму вопросу (т.е. позиция = 1) я получаю:

04-03 23:08:36.994: V/DisplayLists(663): onItemClick(..., 1,...) => selected: -1 

т.е. даже если OnItemClickListener вызывается с правильным аргументом и вызывает setSelection (1), нет выбранного элемента (и, следовательно, также OnItemSelectedListener. onItemSelected (...) никогда не вызывается), а getSelectedItemPosition() все еще дает -1 после набора setSelection (1).

Что мне не хватает?

Майкл

PS .: Мой список делает у> = 2 элементов ...

ответ

8

Недостающий элемент здесь choiceMode. Это не очень хорошо documented, но ListViews (и, в дополнение, все, что наследует от AbsListView, например GridView и т. Д.) В android по умолчанию не позволяют выбирать, но его можно включить - либо в XML, либо в коде:

в XML:

<ListView 
    ... 
    android:choiceMode="singleChoice" /> 

Код:

mListView.setChoiceMode(AbsListView.CHOICE_MODE_SINGLE); 

Обратите внимание, что, как только вы сделаете это, андроид будет setSelection() для вас, так что вам не нужно следить за ним самостоятельно. В этот момент ваш onClickListener только для сохранения выбора, и я даже не заморачиваться с OnSelectedItemListener:

@Override 
public void onItemClick(final AdapterView<?> list, final View v, 
    final int position, final long id) { 
    Participant p = mAdapter.getParticipantForId(id); 
    eventManager.fire(new ParticipantSelectedEvent(p)); 
    pxList.smoothScrollToPosition(position); // Make sure selection is plainly visible 
} 
+2

Почему это было остановлено, точно? Он решает проблему плакатов getSelectedItemPosition(), которая никогда не меняется. Да, если все, что он хочет, это предмет, о котором идет речь, то getItemAtPosition в onItemClick(), безусловно, проще. choiceMode, однако, существует для того, чтобы ** показать ** пользователя, который выбран в данный момент, а также предоставить программисту доступ к нему. – JRaymond

+1

Я добавил режим выбора, как описано (в обоих вариантах), но без изменений! OnItemClickListener все еще не вызван. И это даже несмотря на то, что я получаю реакцию на экране, т. Е. Элемент вскоре становится фиолетовым, а затем снова возвращается к белому. Странно, я * могу * выбирать элементы, нажимая кнопки вверх и вниз (а затем вызывается OnIemSelectListener), но явно не через OnItemClickListener. – mmo

+0

Подождите, так что OnItemClick никогда не называется? OnItemSelect прослушиватель настроен только для материала trackPad/up down - он не отвечает на клики, и я не знаю, ответит ли он на ручной вызов setSelection – JRaymond

2

Попробуйте это: -

ListView lv = getListView(); 

    lv.setOnItemClickListener(new OnItemClickListener() { 
     public void onItemClick(AdapterView<?> parent, View view, 
      int position, long id) { 

      // selected item 
      String product = ((TextView) view).getText().toString(); 

     Toast.makeText(getApplicationContext(), "Selected Item :" +product, Toast.LENGTH_SHORT).show(); 

     } 
    }); 

Надеется, что это поможет.

1

Я только что понял, что я был полностью выключен. В сенсорном режиме вообще не имеет смысла выбирать элемент. Вы просто нажимаете на него, когда нажимаете (и OnClickListener называется). Я только начинаю понимать, что Android заботится обо всех этих устройствах, у которых есть кнопки управления направлением, сенсорные экраны и т. Д. Это не всегда легко представить, как выполняется операция на устройстве, используется или не может тестироваться.

Смежные вопросы