Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- moveToState
- android clean architecture
- 카드내역 공유
- kotlin
- 안드로이드 클린 아키텍쳐
- 작성
- 특가촌
- onViewCreated
- 안드로이드
- todofication
- compileKotlin FAILED
- 뷰 상태 저장
- 올인원타이머
- 대학톡
- List
- recyclerview
- RxJava
- RX
- fragment
- andorid
- Quickly
- nvidia-docker
- Koin
- 타이머앱
- java.lang.OutOfMemoryError: Java heap space
- 뷰 상태복구
- Android
- 카드 내역 공유 앱
- 특가알람
- 특가게시판
Archives
- Today
- Total
seoft
RecyclerView item이 아닌 RecyclerView 자체에 onClickListener 붙이기 본문
문제정의
리사이클러뷰를 다음과 같이 폴더 아이콘 형식으로 사용하고 폴더를 눌렀을 때 이벤트를 발생시켜야 하는데
리사이클러뷰 내 어딘가에서 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로 이벤트를 막아버리는 방법으로 해결하였다. 사용 시 한스 탭 더 들어가서 로직을 처리해야 되는 번거로움이 있지만 더 복잡한 로직을 사용하지 않는 점, 동적으로 관리해야 할 추가적인 뷰가 없다는 점에서 이 방법을 사용하기로 하였다.
'android' 카테고리의 다른 글
kotlin extension 응용 (0) | 2020.02.19 |
---|---|
kotlin list 조합하여 immutable list 만들기 (0) | 2020.01.17 |
부모 뷰의 onTouchListener가 발생하지 않을 때 해결법 (0) | 2020.01.07 |
Android Room 종합예제(기본연동, ForeignKey, enum, list, Rx연동, unit test) (0) | 2019.11.30 |
rxjava subscribeOn observeOn 요약 (0) | 2019.11.30 |
Comments