Skip to content

Commit 428d943

Browse files
Merge pull request #150 from Omega-R/feature/121_disable_swipe_menu
Disable open other item when opening in progress.
2 parents 54f3a48 + a43ae80 commit 428d943

File tree

2 files changed

+61
-54
lines changed

2 files changed

+61
-54
lines changed

omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/OmegaRecyclerView.java

Lines changed: 24 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,18 @@
1313
import android.view.View;
1414
import android.view.ViewGroup;
1515

16+
import androidx.annotation.ColorInt;
17+
import androidx.annotation.ColorRes;
18+
import androidx.annotation.IdRes;
19+
import androidx.annotation.LayoutRes;
20+
import androidx.annotation.NonNull;
21+
import androidx.annotation.Nullable;
22+
import androidx.annotation.StringRes;
23+
import androidx.core.content.ContextCompat;
24+
import androidx.recyclerview.widget.ExpandedRecyclerView;
25+
import androidx.recyclerview.widget.LinearLayoutManager;
26+
import androidx.recyclerview.widget.RecyclerView;
27+
1628
import com.omega_r.libs.omegarecyclerview.header.HeaderFooterWrapperAdapter;
1729
import com.omega_r.libs.omegarecyclerview.item_decoration.DividerItemDecoration;
1830
import com.omega_r.libs.omegarecyclerview.item_decoration.BaseSpaceItemDecoration;
@@ -30,28 +42,20 @@
3042
import java.util.List;
3143
import java.util.WeakHashMap;
3244

33-
import androidx.annotation.ColorInt;
34-
import androidx.annotation.ColorRes;
35-
import androidx.annotation.IdRes;
36-
import androidx.annotation.LayoutRes;
37-
import androidx.annotation.NonNull;
38-
import androidx.annotation.Nullable;
39-
import androidx.annotation.StringRes;
40-
import androidx.core.content.ContextCompat;
41-
import androidx.recyclerview.widget.ExpandedRecyclerView;
42-
import androidx.recyclerview.widget.LinearLayoutManager;
43-
import androidx.recyclerview.widget.RecyclerView;
44-
4545
@SuppressWarnings("rawtypes")
4646
public class OmegaRecyclerView extends ExpandedRecyclerView implements SwipeMenuHelper.Callback {
4747

4848
private static final int[] DEFAULT_DIVIDER_ATTRS = new int[]{android.R.attr.listDivider};
4949

50+
private final WeakHashMap<ViewGroup.LayoutParams, SectionState> mLayoutParamCache = new WeakHashMap<>();
51+
private final SwipeMenuHelper mSwipeMenuHelper = new SwipeMenuHelper(this);
52+
private final PageRequester mPageRequester = new PageRequester();
53+
private final List<View> mHeadersList = new ArrayList<>();
54+
private final List<View> mFooterList = new ArrayList<>();
55+
5056
private View mEmptyView;
5157
private int mEmptyViewId;
5258

53-
private SwipeMenuHelper mSwipeMenuHelper;
54-
private PageRequester mPageRequester = new PageRequester();
5559
private BaseStickyDecoration mBaseStickyDecoration;
5660
private BaseSpaceItemDecoration mBaseSpaceItemDecoration;
5761
private int mStickyMode = StickyAdapter.Mode.HEADER;
@@ -60,9 +64,6 @@ public class OmegaRecyclerView extends ExpandedRecyclerView implements SwipeMenu
6064
@LayoutRes
6165
private int mPaginationErrorLayout = R.layout.pagination_error_omega_layout;
6266
private boolean mFinishedInflate = false;
63-
private List<View> mHeadersList = new ArrayList<>();
64-
private List<View> mFooterList = new ArrayList<>();
65-
private WeakHashMap<ViewGroup.LayoutParams, SectionState> mLayoutParamCache = new WeakHashMap<>();
6667
@Nullable
6768
private DividerItemDecoration mDividerItemDecoration;
6869
private int mItemSpace;
@@ -96,7 +97,6 @@ private void init(Context context, @Nullable AttributeSet attrs, int defStyleAtt
9697
initStickyMode(a);
9798
a.recycle();
9899
}
99-
mSwipeMenuHelper = new SwipeMenuHelper(getContext(), this);
100100
mPageRequester.attach(this);
101101
}
102102

@@ -328,7 +328,7 @@ public void addView(View view, int index, ViewGroup.LayoutParams params) {
328328

329329
@Override
330330
public int getChildCount() {
331-
if (!mIsAdapterConnected && areSectionsInitialized()) {
331+
if (!mIsAdapterConnected && areSectionsInitialized()) {
332332
return super.getChildCount() + mHeadersList.size() + mFooterList.size();
333333
}
334334

@@ -430,17 +430,12 @@ private void findEmptyView() {
430430

431431
@Override
432432
public boolean onInterceptTouchEvent(MotionEvent ev) {
433-
boolean isIntercepted = super.onInterceptTouchEvent(ev);
434-
if (ev.getActionIndex() != 0) return true;
435-
int action = ev.getAction();
436-
437-
switch (action) {
438-
case MotionEvent.ACTION_DOWN:
439-
isIntercepted = mSwipeMenuHelper.handleListDownTouchEvent(ev, isIntercepted);
440-
break;
441-
}
433+
return mSwipeMenuHelper.handleInterceptTouchEvent(ev, super.onInterceptTouchEvent(ev));
434+
}
442435

443-
return isIntercepted;
436+
@Override
437+
public boolean onFilterTouchEventForSecurity(MotionEvent ev) {
438+
return mSwipeMenuHelper.handleTouchEventForSecurity(ev, super.onFilterTouchEventForSecurity(ev));
444439
}
445440

446441
private Drawable getDefaultDivider() {

omegarecyclerview/src/main/java/com/omega_r/libs/omegarecyclerview/swipe_menu/SwipeMenuHelper.java

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,41 @@
11
package com.omega_r.libs.omegarecyclerview.swipe_menu;
22

3-
import android.content.Context;
43
import android.view.MotionEvent;
54
import android.view.View;
6-
import android.view.ViewConfiguration;
75
import android.view.ViewGroup;
86

7+
import androidx.annotation.Nullable;
8+
99
import java.util.ArrayList;
1010
import java.util.List;
1111

1212
public class SwipeMenuHelper {
1313

1414
private static final int INVALID_POSITION = -1;
1515

16-
private Callback mCallback;
17-
16+
private final Callback mCallback;
17+
@Nullable
1818
private SwipeHorizontalMenuLayout mOldSwipedView;
19-
2019
private int mOldTouchedPosition = INVALID_POSITION;
2120

22-
public SwipeMenuHelper(Context context, Callback callback) {
21+
public SwipeMenuHelper(Callback callback) {
2322
mCallback = callback;
24-
ViewConfiguration.get(context);
2523
}
2624

27-
public boolean handleListDownTouchEvent(MotionEvent ev, boolean defaultIntercepted) {
28-
boolean isIntercepted = defaultIntercepted;
25+
public boolean handleTouchEventForSecurity(MotionEvent ev, boolean defaultResult) {
26+
if (mOldSwipedView == null ||
27+
ev.getActionIndex() == 0 ||
28+
ev.getActionMasked() != MotionEvent.ACTION_POINTER_DOWN) return defaultResult;
29+
30+
int pointerId = ev.getPointerId(ev.getActionIndex());
31+
SwipeHorizontalMenuLayout touchingView = getTouchingView(ev.getX(pointerId), ev.getY(pointerId));
32+
return mOldSwipedView.equals(touchingView) && defaultResult;
33+
}
34+
35+
public boolean handleInterceptTouchEvent(MotionEvent ev, boolean defaultResult) {
36+
if (ev.getActionIndex() != 0 || ev.getAction() != MotionEvent.ACTION_DOWN) return defaultResult;
37+
38+
boolean isIntercepted = defaultResult;
2939
View touchingView = findChildViewUnder((int) ev.getX(), (int) ev.getY());
3040
int touchingPosition;
3141

@@ -42,16 +52,11 @@ public boolean handleListDownTouchEvent(MotionEvent ev, boolean defaultIntercept
4252
}
4353
}
4454

45-
touchingView = mCallback.transformTouchView(touchingPosition, touchingView);
46-
47-
if (touchingView instanceof ViewGroup) {
48-
View itemView = getSwipeMenuView((ViewGroup) touchingView);
49-
if (itemView instanceof SwipeHorizontalMenuLayout) {
50-
mOldSwipedView = (SwipeHorizontalMenuLayout) itemView;
51-
mOldTouchedPosition = touchingPosition;
52-
}
55+
touchingView = extractSwipeMenuView(mCallback.transformTouchView(touchingPosition, touchingView));
56+
if (touchingView != null) {
57+
mOldSwipedView = (SwipeHorizontalMenuLayout) touchingView;
58+
mOldTouchedPosition = touchingPosition;
5359
}
54-
5560
if (isIntercepted) {
5661
mOldSwipedView = null;
5762
mOldTouchedPosition = INVALID_POSITION;
@@ -60,21 +65,28 @@ public boolean handleListDownTouchEvent(MotionEvent ev, boolean defaultIntercept
6065
return isIntercepted;
6166
}
6267

63-
private View getSwipeMenuView(ViewGroup itemView) {
64-
if (itemView instanceof SwipeHorizontalMenuLayout) {
65-
return itemView;
68+
private SwipeHorizontalMenuLayout getTouchingView(float eventX, float eventY) {
69+
View touchingView = findChildViewUnder(eventX, eventY);
70+
if (touchingView != null) {
71+
int touchingPosition = mCallback.getPositionForView(touchingView);
72+
touchingView = mCallback.transformTouchView(touchingPosition, touchingView);
6673
}
74+
return extractSwipeMenuView(touchingView);
75+
}
76+
77+
@Nullable
78+
private SwipeHorizontalMenuLayout extractSwipeMenuView(@Nullable View view) {
79+
if (view instanceof SwipeHorizontalMenuLayout) return (SwipeHorizontalMenuLayout) view;
6780

6881
List<View> unvisited = new ArrayList<>();
69-
unvisited.add(itemView);
82+
if (view != null) unvisited.add(view);
7083

7184
while (!unvisited.isEmpty()) {
7285
View child = unvisited.remove(0);
7386

87+
if (child instanceof SwipeHorizontalMenuLayout) return (SwipeHorizontalMenuLayout) child;
7488
if (!(child instanceof ViewGroup)) continue;
7589

76-
if (child instanceof SwipeHorizontalMenuLayout) return child;
77-
7890
ViewGroup group = (ViewGroup) child;
7991
int childCount = group.getChildCount();
8092

@@ -83,7 +95,7 @@ private View getSwipeMenuView(ViewGroup itemView) {
8395
}
8496
}
8597

86-
return itemView;
98+
return null;
8799
}
88100

89101
private View findChildViewUnder(float x, float y) {

0 commit comments

Comments
 (0)