안드로이드

안드로이드 RecyclerView 아이템 스크롤 시 아이템 터치 이벤트 막기!

알통몬_ 2019. 7. 8. 11:56
반응형


공감 및 댓글은 포스팅 하는데

 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 

도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 

만들어 나가겠습니다^^

 


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 조건의 이벤트를 제한할 수 있습니다.


이상입니다. 감사합니다.

반응형