У меня есть RecyclerView
. В моем элементе RecyclerView
нажмите, чтобы отправить данные на сервер. Но так как пользователь может нажать несколько раз на этот элемент, я отправляю данные только через секунду. Вот мой код.
// Initialized in scope
private final Handler handler = new Handler();
private Map<Integer, Runnable> mRunnableMap = new HashMap<>();
// Initialized in adapter
private long mLastClickTime;
private int lastClickItemPosition;
@Override
public void onClick(View v) {
final Game game = getAdapterPosition();
if (SystemClock.elapsedRealtime() - mLastClickTime < 1000 && lastClickItemPosition == getAdapterPosition())
handler.removeCallbacks(mRunnableMap.get(getAdapterPosition()));
mLastClickTime = SystemClock.elapsedRealtime();
lastClickItemPosition = getAdapterPosition();
Runnable runnable = () -> sendDataToServer();
mRunnableMap.put(getAdapterPosition(), runnable);
handler.postDelayed(mRunnableMap.get(getAdapterPosition()), 1000);
}
Вот несколько критериев ->
- Пользователь может несколько раз щелкнуть один и тот же элемент - отправлять только последнее состояние щелчка через секунду (состояние - что я могу выбрать или отменить выбор элемента и пропорционально обновить или удалить с сервера. Да, мой элемент имеет состояние).
- Пользователь может несколько раз щелкнуть один элемент, а затем несколько раз щелкнуть другой элемент. Таким образом, мы должны отправить первый и второй элемент в последнем состоянии через секунду.
Как видите, я проверяю, является ли текущий пользовательский щелчок и истекшее время предыдущего щелчка ниже секунды, и если предыдущий и текущий щелкнутые элементы То же самое, я очищаю обработчик (чтобы предотвратить обработчик отправлять данные в несколько кликов). Но эта проверка не сработала, когда я несколько раз щелкнул по разным элементам, например, несколько раз щелкнул по любому элементу, чем несколько раз щелкнул по другому элементу ... Поэтому для решения этой проблемы я использовал список runnables
. Это означает, что каждому элементу в recyclerView
соответствует runnable
. И это сработало. Но я хочу знать, есть ли другой способ достичь этого?