| 知乎专栏 |
按钮点击自定义事件,增加防止连续点击逻辑
package cn.netkiller.view;
import android.util.Log;
import android.view.View;
public abstract class CustomOnClickListener implements View.OnClickListener {
private static final String TAG = CustomOnClickListener.class.getSimpleName();
private long mLastClickTime;
private long timeInterval = 1000L;
public CustomOnClickListener() {
}
public CustomOnClickListener(long interval) {
this.timeInterval = interval;
}
@Override
public void onClick(View v) {
long nowTime = System.currentTimeMillis();
if (nowTime - mLastClickTime > timeInterval) {
// 单次点击事件
onSingleClick(v);
mLastClickTime = nowTime;
Log.d(TAG, "onSingleClick");
} else {
// 快速点击事件
onFastClick();
Log.d(TAG, "onFastClick");
}
}
protected abstract void onSingleClick(View v);
protected abstract void onFastClick();
}
package cn.netkiller.view;
import android.widget.CompoundButton;
public abstract class CustomOnCheckedChangeListener implements CompoundButton.OnCheckedChangeListener {
@Override
public void onCheckedChanged(CompoundButton compoundButton, boolean status) {
if (!compoundButton.isPressed()) return;
if (status) {
on();
} else {
off();
}
onCheckedChanged(status);
}
protected abstract void on();
protected abstract void off();
protected abstract void onCheckedChanged(boolean status);
}
防止连续性点击
package cn.netkiller.view;
import android.os.Handler;
import android.os.Looper;
import android.util.Log;
import android.view.MenuItem;
import androidx.annotation.NonNull;
import com.google.android.material.navigation.NavigationView;
public abstract class CustomOnItemSelectedListener implements NavigationView.OnNavigationItemSelectedListener {
private static final String TAG = CustomOnItemSelectedListener.class.getSimpleName();
private boolean isSelected = false;
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
if (isSelected) {
Log.d(TAG, "连续点击");
} else {
isSelected = true;
new Handler(Looper.getMainLooper()).postDelayed(new Runnable() {
public void run() {
isSelected = false;
}
}, 1500);
onOnceNavigationItemSelected(item);
return true;
}
return false;
}
protected abstract void onOnceNavigationItemSelected(@NonNull MenuItem item);
}
package cn.netkiller.view;
import android.widget.AbsListView;
public abstract class CustomOnScrollListener implements AbsListView.OnScrollListener {
private static final String TAG = CustomOnScrollListener.class.getSimpleName();
private final int getLastVisiblePosition = 0;
private final int lastVisiblePositionY = 0;
private int state = -1;
private boolean isLoading = false;
private int itemCount = 0;
public CustomOnScrollListener() {
}
public CustomOnScrollListener(int itemCount) {
this.itemCount = itemCount;
}
@Override
public void onScrollStateChanged(AbsListView absListView, int scrollState) {
state = scrollState;
// Log.d(TAG, "onScrollStateChanged " + scrollState);
if (scrollState == AbsListView.OnScrollListener.SCROLL_STATE_IDLE && isLoading) {
// Log.e(TAG, "onScrollStateChanged: " + scrollState + " getLastVisiblePosition: " + absListView.getLastVisiblePosition() + " getCount: " + absListView.getCount() + " itemCount: " + itemCount);
onLoading();
isLoading = false;
// if (absListView.getLastVisiblePosition() == (absListView.getCount() - 1)) {
// itemCount = onLoading();
// Log.e(TAG, "onScrollStateChanged 滑动到底部 " + itemCount);
//
// }
}
}
@Override
// public void onScroll(AbsListView absListView, int i, int i1, int i2) {
public void onScroll(AbsListView absListView, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
// if (state == AbsListView.OnScrollListener.SCROLL_STATE_IDLE) {
//// if (isLoading) {
// Log.d(TAG, "onScroll " + "firstVisibleItem:" + firstVisibleItem + ", visibleItemCount:" + visibleItemCount + ", totalItemCount:" + totalItemCount + " State: " + state);
// if (firstVisibleItem + visibleItemCount == totalItemCount && totalItemCount > 0) {
// Log.e(TAG, "onScroll 滑动到底部");
// Toast.makeText(absListView.getContext(), "数据加载中...", Toast.LENGTH_SHORT).show();
// onLoading();
// state = -1;
// isLoading = false;
// }
// }
isLoading = (totalItemCount == firstVisibleItem + visibleItemCount);
if (firstVisibleItem == 0) {
onRefresh();
}
}
// protected abstract void onDown();
//
// protected abstract void onUp();
protected abstract void onRefresh();
protected abstract int onLoading();
}
package cn.netkiller.view;
import android.util.Log;
import com.google.android.material.tabs.TabLayout;
public class CustomOnTabSelectedListener implements TabLayout.OnTabSelectedListener {
private static final String TAG = CustomOnTabSelectedListener.class.getSimpleName();
private final long timeInterval = 1000L;
private long lastClickTime;
@Override
public void onTabSelected(TabLayout.Tab tab) {
long nowTime = System.currentTimeMillis();
if (nowTime - lastClickTime > timeInterval) {
// 单次点击事件
onSingleTabSelected(tab);
lastClickTime = nowTime;
Log.d(TAG, "onSingleTabSelected");
} else {
// 快速点击事件
onFastTabSelected(tab);
Log.d(TAG, "onFastTabSelected");
}
}
@Override
public void onTabUnselected(TabLayout.Tab tab) {
}
@Override
public void onTabReselected(TabLayout.Tab tab) {
}
protected void onSingleTabSelected(TabLayout.Tab tab) {
}
protected void onFastTabSelected(TabLayout.Tab tab) {
}
}