知乎专栏 |
按钮点击自定义事件,增加防止连续点击逻辑
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) { } }