接到一個(gè)新需求,要求實(shí)現(xiàn)控件 RecyclerView 的 item 的單擊和雙擊事件的監(jiān)聽,
開始時(shí)候通過實(shí)現(xiàn) OnTouchListener 監(jiān)聽實(shí)現(xiàn)了需求,點(diǎn)擊是沒有問題的,
可是測(cè)試時(shí)候發(fā)現(xiàn) RecyclerView 滑動(dòng)的時(shí)候就也會(huì)觸發(fā)這個(gè)點(diǎn)擊事件,
應(yīng)該是我沒處理事件的結(jié)果.后來索性查資料換個(gè)了方法,直接實(shí)現(xiàn)OnClickListener
監(jiān)聽改變一下.就不會(huì)有這個(gè)問題了. 用法和正常的點(diǎn)擊監(jiān)聽相同,實(shí)現(xiàn)回調(diào)就好.
以下代碼:
public class DoubleClickListener implements View.OnClickListener {
//記錄連續(xù)點(diǎn)擊次數(shù)
private int clickCount = 0;
private Handler handler;
private DoubleClickCallBack myClickCallBack;
public interface DoubleClickCallBack {
//點(diǎn)擊一次的回調(diào)
void oneClick(View view);
//連續(xù)點(diǎn)擊兩次的回調(diào)
void doubleClick(View view);
}
public DoubleClickListener(DoubleClickListener.DoubleClickCallBack myClickCallBack) {
this.myClickCallBack = myClickCallBack;
handler = new Handler();
}
@Override
public void onClick(View v) {
clickCount++;
//雙擊間二百毫秒延時(shí)
int timeout = 200;
handler.postDelayed(() -> {
if (clickCount == 1) {
myClickCallBack.oneClick(v);
} else if (clickCount == 2) {
myClickCallBack.doubleClick(v);
}
//清空handler延時(shí)沈善,并防內(nèi)存泄漏
handler.removeCallbacksAndMessages(null);
//計(jì)數(shù)清零
clickCount = 0;
}, timeout);//延時(shí)timeout后執(zhí)行run方法中的代碼
}
}
參考文章:https://blog.csdn.net/htwhtw123/article/details/80150984
希望能對(duì)大家有所幫助,歡迎大家一起討論交流乡数。
image