У меня было точно такое же требование, так как onItemSelected будет вызываться так часто, если пользователь, прокручивая Галерею, хотел избежать этих событий. Я реализовал простой механизм задержки с помощью обработчика следующим образом:
Определите экземпляр обработчика в классе Activity и переопределите handleMessage , который должен иметь логику onItemSelected. Здесь я msg.obj содержит текст выбранного элемента из галереи
Handler handler = new Handler() {
public void handleMessage(Message msg) {
// Add your OnItemSelected code here
Log.d("Gallery", msg.obj + "");
Toast.makeText(MainActivity.this, msg.obj + "", Toast.LENGTH_SHORT)
.show();
}
};
Это просто произвольная константа для ссылки на сообщение, которое я отправляю с OnItemSelected
public static final int MSG_ITEM_SELECTION = 1;
В onItemSelected я сначала удаляю любое предыдущее сообщение, чтобы избежать запуска события, пока пользователь вращает галерею, а затем добавляю новый объект сообщения с выбранным текстом элемента и публикую его с задержкой 500 мс.
public void onItemSelected(AdapterView<?> adapter, View view,
int position, long id) {
handler.removeMessages(MSG_ITEM_SELECTION);
Message msg = handler.obtainMessage(MSG_ITEM_SELECTION);
msg.obj = ((TextView) view).getText();
handler.sendMessageDelayed(msg, 500);
}
Этот код отлично работает для меня, и я получаю onItemSelected только тогда, когда элемент галереи действительно выбран после остановки вращения.