Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Как задержать исполнение onItemSelected в ListView?

#android #listview


Как сделать так, чтобы при быстром переключении в ListView, выполнялось только действие,
соответствующее пункту, на котором пользователь задержался на некоторое время(например,
на 300 мс), а те, что быстро перелистнулись, игнорировались?    


Ответы

Ответ 1



private Runnable mMyRunnable = new Runnable() { @Override public void run() { //Делаем что нужно } }; Handler myHandler = new Handler(); myHandler.postDelayed(mMyRunnable, 300);//Даем команду выполнить через 300мс не то?

Ответ 2



Решение найдено. Я сделала, как советовал @katso, только еще прописала: public void onItemSelected(AdapterView parent, View v, int position, long id) { savedItem = position; //Удаляем все отложенные задания myHandler.removeCallbacks(mMyRunnable); //Задаем новое myHandler.postDelayed(mMyRunnable,300); } Здесь в глобальный savedItem сохраняется номер выбранного пункта, а в mMyRunnable.run() код выполняется в зависимости от этого сохраненного номера.

Ответ 3



Задержать выполнение можно вызвав Thread.sleep(3000), где 3000 - миллисекунды, то бишь 3 секунды. Но задерживать поток UI(он же главный, он же текущий по-умолчанию) - это перебор, не делайте так никогда. Можно написать кастомную анимацию для выбранного View и анимацию для самого списка. К примеру, выбрав элемент списка, анимация для выбранного вью его увеличит, а анимация списка уберет все остальные. Но тут нужно все продумать детально, ибо их взаимодействие - задача порой не простая.

Ответ 4



Попробуйте сделать так. Заводите список отложенных задач. По приходу пользователя к пункту ListView, добавляете задачу в список и запускаете таймер. По уходу пользователя из пункта ListView, выкидываете задачу из списка (если она ещё там есть) и останавливаете таймер (если ещё не остановлен). По приходу таймера, если задача ещё не выкинута из списка, выполняете задачу и останавливаете таймер. Вроде должно работать. Если есть возможность подписаться на "длинный" hover/touch, конечно воспользуйтесь именно им, и не переизобретайте велосипед. Если воспользоваться упомянутым @katso postDelayed, можно сделать так: Каждому заданию назначаем глобальный ID типа, скажем, long. В new Runnable() запоминаем уникальный ID в final-поле; запоминаем этот ID в поле long activeID. В методе Run проверяем, совпадает ли его ID с activeID; если нет, прекращаем выполнение.

Комментариев нет:

Отправить комментарий