Почему мой OnItemSelectedListener не вызывается в ListView?
-
20-09-2019 - |
Вопрос
Я использую ListView, который настроен следующим образом:
<ListView android:id="@android:id/list" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:longClickable="false"
android:choiceMode="singleChoice">
</ListView>
В моем коде я добавляю OnItemSelectedListener в ListView следующим образом:
getListView().setAdapter(adapter);
getListView().setOnItemSelectedListener(this);
моя активность реализует слушателя следующим образом:
@Override
public void onItemSelected(AdapterView<?> parent, View view, int position, long id) {
Log.d("Tag", "ListItemSelected: Parent: " + parent.toString() + " View: "
+ view.toString() + " Position: " + " Id: " + id);
}
Я надеялся, что увижу этот отладочный результат в тот момент, когда нажму на что-то в списке.Но отладочный вывод никогда не отображается в LogCat.
Решение
В OnItemSelectedListener
прослушивает выбранные элементы списка, а не щелчки по элементам списка.
Выделение в этом случае можно рассматривать как перемещение фокуса на этот элемент с помощью трекпада устройства.
Чтобы получить желаемое поведение, необходимо использовать OnItemClickListener
.
Другие советы
Это потому, что вы проводите тестирование пальцами на устройстве с сенсорным управлением.В сенсорный режим, нет фокуса и нет выбора.Пользовательские интерфейсы, которым требуется выбор, должны использовать другой тип виджета, например переключатели.
Сначала вы должны установить ChoiceMode
, а затем,в ListView выбранное событие не будет принято, потому что setOnItemSelectedListener
зарегистрирован в AdapterView
, и обратный вызов в методе handleDataChanged()
, но класс AbsListView
переопределите этот метод и никогда не выполняйте обратный вызов OnItemSelectedListener
вы можете получить seletedItem с помощью этого метода в setOnItemClickListener
mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Log.e("TAG", "onItemClick: " + position);
SparseBooleanArray positions = mListView.getCheckedItemPositions();
Log.e("TAG", "onItemSelected: " + positions.toString());
}
});