공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
RecyclerView Scroll 시 Item touchevent 를 막는 예제입니다.
RecyvlerView 사용 시 Item 들의 터치 이벤트는 대부분
RecyvlerView.OnItemTouchListener 인터페이스의 메소드들을 재정의해서
이벤트를 만듭니다.
private RecyclerView.OnItemTouchListener onItemTouchListener = new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView parent, @NonNull MotionEvent evt) {
if (MotionEvent.ACTION_UP == evt.getAction()) {
}
return false;
}
@Override
public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
};
그런데 이렇게 구현할 때의 문제점은 motionEvent에는 스크롤을 감지하는
메소드는 없어서 스크롤 후 Action up이 되므로 원치 않게 ACTION_UP 이벤트도
동시에 발생하게 됩니다.
이러한 이벤트의 중복을 막기 위한 방법이 있는데요.
다른 분들은 어떻게 구현하시는지 모르겠지만, 저는 OnScrollListener 클래스를
상속받는 커스텀 클래스를 사용합니다.
1. boolean 필드 만들기
private boolean itemTouch;
2. OnScrollListener 상속받는 커스텀 클래스 만들기
private RecyclerView.OnScrollListener onScrollChangeListener = new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(@NonNull RecyclerView recyclerView, int newState) {
super.onScrollStateChanged(recyclerView, newState);
}
@Override
public void onScrolled(@NonNull RecyclerView recyclerView, int dx, int dy) {
super.onScrolled(recyclerView, dx, dy);
itemTouch = false;
}
};
3. onItemTouchListener 에 ACTION_DOWN 조건문 추가하기
private RecyclerView.OnItemTouchListener onItemTouchListener = new RecyclerView.OnItemTouchListener() {
@Override
public boolean onInterceptTouchEvent(@NonNull RecyclerView parent, @NonNull MotionEvent evt) {
if (MotionEvent.ACTION_UP == evt.getAction() && itemTouch) {
//TODO 여기서 원하는 이벤트를 진행합니다.
} else if (MotionEvent.ACTION_DOWN == evt.getAction()) {
itemTouch = true;
}
return false;
}
@Override
public void onTouchEvent(@NonNull RecyclerView rv, @NonNull MotionEvent e) {
}
@Override
public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {
}
};
4. RecyclerView에 listener add하기
binding.imgViews.addOnItemTouchListener(onItemTouchListener);
binding.imgViews.addOnScrollListener(onScrollChangeListener);
호출 순서는
No Scroll ->ACTION_DOWN -> ACTION_UP이,
Scroll -> ACTION_DOWN -> onScrolled() -> ACTION_UP이 됩니다.
이렇게 add 하면 이제 스크롤 없이 ACTION_DOWN -> ACTION_UP으로
진행될 때는 itemTouch == true 이므로 ACTION_UP 조건문에 있는
이벤트가 진행되고 SCROLL을 했을 때는
ACTION_DOWN -> onScrolled() -> ACTION_UP 으로
itemTouch == false 가 되어서 ACTION_UP 조건의 이벤트를 제한할 수 있습니다.
이상입니다. 감사합니다.
'안드로이드' 카테고리의 다른 글
안드로이드 string.xml 에서 Html 태그 제대로 적용안될 때 해결방법 (0) | 2019.07.10 |
---|---|
안드로이드 VideoView 영상 사이즈 화면 사이즈만큼 늘이기 (2) | 2019.07.08 |
안드로이드 런처 아이콘, 앱 실행 아이콘 쉽게 생성하기! (0) | 2019.07.08 |
안드로이드 갤러리 폴더 목록 가져오기 두 번째 방법 (1) | 2019.07.04 |
안드로이드 R.drawable.IDs drawable에 있는 이미지들 array.xml에 배열로 추가해서 사용하기 (0) | 2019.07.03 |