2015-02-11 3 views
0

У меня есть ListView лекарств, которые используют CursorAdapter. Моя цель - получить ссылку на Курсор выбранного элемента, когда пользователь нажимает кнопку отправки, но я все равно получаю нулевое значение. Вот мой текущий код:Какие действия запускаются в элементе, выбранном в ListView?

mSubmitButton.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     Cursor selectedMedication = (Cursor) mMedicationListView.getSelectedItem(); 
     if(selectedMedication != null) 
     { 
      MedicationSelectionListener activity = (MedicationSelectionListener) getActivity(); 
      activity.onMedicationSelected(new Medication(selectedMedication)); 
     } else{ 
      Toast.makeText(getActivity(), "Must select a medication.", Toast.LENGTH_SHORT).show(); 
     } 
    } 
}); 

Когда это выполняется, selectedMedication всегда нуль. Я внедрил drawable selector.xml-файл, который меняет цвет фона элемента при его нажатии, и это работает отлично, поэтому у меня создалось впечатление, что щелчка по элементу было достаточно.

Я также попытался следующие, установив выбранной переменной лекарства, каждый раз, когда пункт щелкнул:

mMedicationListView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
     Cursor c = (Cursor) mMedicationListView.getItemAtPosition(position); 
     if(c.moveToFirst()) 
      mSelectedMedication = new Medication(c); 
    } 
}); 

Это работало хорошо, но я чувствовал, что предварительно кучу бессмысленных операций, когда все, что я заинтересован in - окончательный выбранный элемент. Должен ли щелкнуть элемент триггером mMedicationListView.onItemSelected()? Если нет, какое действие используется для обеспечения того, чтобы это произошло?

+0

Что вы подразумеваете под «кучей бессмысленных операций»? – Emmanuel

+0

@ Emmanuel Предположим, у меня есть большой список лекарств, и по какой-то причине пользователь выбирает вверх и вниз каждый из них. Каждый раз, когда я меняю это поле класса (это не тяжелая операция, я получаю это), но зачем тратить время на это, когда я должен просто прочитать выделенный элемент в конце? – AdamMc331

ответ

2

поэтому у меня сложилось впечатление, что щелчка по элементу было достаточно.

Клики не выбираются с помощью ListView. Выбор будет происходить либо при:

  • установить выбор программно или

  • пользователь использует навигационную опцию пятипозиционный (например, D-Pad, трекбол, клавиши со стрелками) и нажимает вверх/вниз на то, чтобы переместить полосу выделения вокруг

все, что я заинтересован в является завершающим выбранный элемент

A ListView - это командный виджет по умолчанию. Когда пользователь нажимает на строку в ListView, ваше приложение должно делать что-то, обычно избавляясь от ListView по пути.

Если, OTOH, пользователь выбирает что-то, где список и выбор остаются на экране (например, шаблон основной детали, выбирая состояние/провинцию как часть заполнения адреса), тогда вы должны используйте режим выбора. Это может быть режим с одним выбором (обычно представленный радиокнопками по правому краю), режим множественного выбора (обычно представленный с помощью флажков по правому краю) или режим с несколькими вариантами выбора (обычно представленный "активированным" state устанавливает постоянную подсветку, обычно зарезервированную для сортировки сценариев мастер-детали).

Do не попытка перегрузить «выбор» означает «выбор». Похоже, вы представляете ListView как часть чего-то большего, где пользователь делает выбор, поэтому используйте для этого режим выбора.

+0

Спасибо за разъяснение разницы, я понятия не имел, что это было специфично для вариантов навигации, как вы упомянули. ListView уже выбран. Должен ли я продолжать обрабатывать это с помощью метода onClick? – AdamMc331

+1

@ McAdam331: Если это список с одним выбором, вы узнаете, что пользователь выбрал через 'getCheckedItemPosition()', вызвал ваш 'ListView'. – CommonsWare

+0

Хорошо, я получил эту работу. В очередной раз благодарим за помощь. – AdamMc331