I have a problem with my app that if the user clicks the button multiple times quickly, then multiple events are generated before even my dialog holding the button disappear
Here is a pretty simple solution, which can be used with lambdas:
view.setOnClickListener(new DebounceClickListener(v -> this::doSomething));
Here is the copy/paste ready snippet:
public class DebounceClickListener implements View.OnClickListener {
private static final long DEBOUNCE_INTERVAL_DEFAULT = 500;
private long debounceInterval;
private long lastClickTime;
private View.OnClickListener clickListener;
public DebounceClickListener(final View.OnClickListener clickListener) {
this(clickListener, DEBOUNCE_INTERVAL_DEFAULT);
}
public DebounceClickListener(final View.OnClickListener clickListener, final long debounceInterval) {
this.clickListener = clickListener;
this.debounceInterval = debounceInterval;
}
@Override
public void onClick(final View v) {
if ((SystemClock.elapsedRealtime() - lastClickTime) < debounceInterval) {
return;
}
lastClickTime = SystemClock.elapsedRealtime();
clickListener.onClick(v);
}
}
Enjoy!