Home | 简体中文 | 繁体中文 | 杂文 | Github | 知乎专栏 | Facebook | Linkedin | Youtube | 打赏(Donations) | About
知乎专栏

4.11. 自定义事件

4.11.1. 按钮点击事件

按钮点击自定义事件,增加防止连续点击逻辑

			
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();

}			
			
			

4.11.2. OnCheckedChangeListener

			
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);
}

			
			

4.11.3. CustomOnItemSelectedListener

防止连续性点击

			
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);
}

			
			

4.11.4. CustomOnScrollListener

			
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();
}
			
			

4.11.5. CustomOnTabSelectedListener

			
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) {

    }
}