version:2.8.5
- 更多分享请看:http://www.cherylgood.cn
今天我们主要来分析BaseRecyclerViewAdapterHelper为view提供监听点击事件能力的相关源码。
public abstract class SimpleClickListener implements RecyclerView.OnItemTouchListener {
private GestureDetectorCompat mGestureDetector;
private RecyclerView recyclerView;
protected BaseQuickAdapter baseQuickAdapter;
public static String TAG = "SimpleClickListener";
private boolean mIsPrepressed = false;
private boolean mIsShowPress = false;
private View mPressedView = null;
@Override
public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
Log.i(TAG,">>>>onInterceptTouchEvent e"+e.getActionMasked());
if (recyclerView == null) {
this.recyclerView = rv;
this.baseQuickAdapter = (BaseQuickAdapter) recyclerView.getAdapter();
mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(), new ItemTouchHelperGestureListener(recyclerView));
}else if (recyclerView!=rv){
this.recyclerView = rv;
this.baseQuickAdapter = (BaseQuickAdapter) recyclerView.getAdapter();
mGestureDetector = new GestureDetectorCompat(recyclerView.getContext(), new ItemTouchHelperGestureListener(recyclerView));
}
if (!mGestureDetector.onTouchEvent(e) && e.getActionMasked() == MotionEvent.ACTION_UP && mIsShowPress) {
if (mPressedView!=null){
BaseViewHolder vh = (BaseViewHolder) recyclerView.getChildViewHolder(mPressedView);
if (vh == null ||!isHeaderOrFooterView(vh.getItemViewType())) {
mPressedView.setPressed(false);
}
}
mIsShowPress = false;
mIsPrepressed = false;
}
return false;
}
@Override
public void onTouchEvent(RecyclerView rv, MotionEvent e) {
Log.i(TAG,">>>>onTouchEvent e"+e.getActionMasked());
mGestureDetector.onTouchEvent(e);
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
Log.i(TAG,">>>>onRequestDisallowInterceptTouchEvent disallowIntercept"+disallowIntercept);
}
private class ItemTouchHelperGestureListener extends GestureDetector.SimpleOnGestureListener {
private RecyclerView recyclerView;
ItemTouchHelperGestureListener(RecyclerView recyclerView) {
this.recyclerView = recyclerView;
}
@Override
public boolean onDown(MotionEvent e) {
mIsPrepressed = true;
mPressedView = recyclerView.findChildViewUnder(e.getX(), e.getY());
super.onDown(e);
return false;
}
@Override
public void onShowPress(MotionEvent e) {
Log.i(TAG,">>>>onShowPress e"+e);
if (mIsPrepressed && mPressedView != null) {
// mPressedView.setPressed(true);
mIsShowPress = true;
}
super.onShowPress(e);
}
@Override
public boolean onSingleTapUp(MotionEvent e) {
Log.i(TAG,">>>>onSingleTapUp e"+e);
if (mIsPrepressed && mPressedView != null) {
if (recyclerView.getScrollState()!=RecyclerView.SCROLL_STATE_IDLE){
return false;
}
final View pressedView = mPressedView;
BaseViewHolder vh = (BaseViewHolder) recyclerView.getChildViewHolder(pressedView);
if (isHeaderOrFooterPosition(vh.getLayoutPosition())) {
return false;
}
Set<Integer> childClickViewIds = vh.getChildClickViewIds();
Set<Integer> nestViewIds = vh.getNestViews();
if (childClickViewIds != null && childClickViewIds.size() > 0) {
for (Integer childClickViewId : childClickViewIds) {
View childView = pressedView.findViewById(childClickViewId);
if (childView != null) {