seoft

RecyclerView item이 아닌 RecyclerView 자체에 onClickListener 붙이기 본문

android

RecyclerView item이 아닌 RecyclerView 자체에 onClickListener 붙이기

seoft 2020. 1. 12. 12:45

문제정의

리사이클러뷰를 다음과 같이 폴더 아이콘 형식으로 사용하고 폴더를 눌렀을 때 이벤트를 발생시켜야 하는데

 

리사이클러뷰 내 어딘가에서 touchEvent를 소비해버린다.

 

리사이클러뷰에 onInterceptTouchEvent를 걸어 onTouch로 onClick을 대체하는 방법(https://seoft.tistory.com/32)이 있지만 onLongClick까지 적용시키기엔 좌표와 time계산을 통해서 혹은 gestureListener를 통해서 해결이 가능한데 단순 터치를 적용시키기 위해서 너무 과한 방법이라 판단하였다.

검색 후 리사이클러뷰 위에 뷰를 하나 덧되어 그 뷰에 터치 이벤트를 먹이는 방법도 있었지만 동적으로 생성하고 없애주는 경우에 뷰를 두 개씩 관리해야 된다는 점에서 채택되지 않았고 다른 방안을 찾아보았다.

 

 

문제 해결을 위해 다양한 방법을 시도해봤는데 모두 원하는 대로 되지  않았다. (다른 방법으로 되신 분 알려주시면 감사하겠습니다)

 

시행착오 리스트

1. 리사이클러 뷰 내 모든 아이템들의 clickable을 false (아이템들에서 touch를 놔주지 않나 싶어서..)

2. 리사이클러 뷰를 동적으로 생성하면서 onInterceptTouchEvent 혹은 dispatchTouchEvent 또는 둘 다 true를 줘서 이벤트를 가로채는 걸로 재정의(아이템들에게 터치 이벤트를 내려주지 않게 하기 위함)

3. 리사이클러 뷰를 커스텀뷰로 생성하면서 onInterceptTouchEvent 혹은 dispatchTouchEvent 또는 둘 다 true를 줘서 이벤트를 가로채는 걸로 재정의(2번과 같은 방식인데 혹시 싶어서)

 

해결방안

순수 RecyclerView가 아닌 뷰그룹으로 한번 깜 싼 후 뷰그룹에서 onInterceptTouchEvent로 이벤트를 막아버리는 방법으로 해결하였다. 사용 시 한스 탭 더 들어가서 로직을 처리해야 되는 번거로움이 있지만 더 복잡한 로직을 사용하지 않는 점, 동적으로 관리해야 할 추가적인 뷰가 없다는 점에서 이 방법을 사용하기로 하였다.

 

 

Comments