참고한 글
RecyclerView 를 프로그램적으로 클릭(강제클릭)이 가능한가요?
요즘 핫한 Chat GPT 에게도 물어봤다.
Q: 안드로이드에 recycler view에서 클릭을 강제로 발생시키고싶어
A: 안드로이드에서 RecyclerView에서 클릭을 강제로 발생시키려면 다음과 같이 코드를 작성할 수 있습니다.
- RecyclerView의 position으로 아이템 뷰를 가져옵니다.
- 아이템 뷰에서 클릭 리스너를 가져옵니다.
- 클릭 리스너의 onClick() 메소드를 호출합니다.
다음은 이에 대한 코드 예시입니다.
val position = 0 // 강제로 클릭할 아이템의 위치
val recyclerView = findViewById<RecyclerView>(R.id.recycler_view)
val itemView = recyclerView.layoutManager?.findViewByPosition(position)
if (itemView != null) {
itemView.performClick() // 아이템 뷰에서 클릭 이벤트 발생
} else {
recyclerView.layoutManager?.scrollToPosition(position)
recyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
super.onScrolled(recyclerView, dx, dy)
val itemView = recyclerView.layoutManager?.findViewByPosition(position)
if (itemView != null) {
itemView.performClick() // 아이템 뷰에서 클릭 이벤트 발생
recyclerView.removeOnScrollListener(this)
}
}
})
}
이 코드는 강제로 클릭할 위치(position)의 아이템 뷰를 가져오고, 해당 아이템 뷰에서 클릭 리스너를 찾아 onClick() 메소드를 호출합니다. 그러나 만약 해당 위치에 아이템 뷰가 없다면 RecyclerView를 스크롤해서 해당 위치에 아이템 뷰가 나타날 때까지 기다린 후 클릭을 수행합니다.
친절하네요...^.^
# 현실
그런데 말입니다....
특정 데이터를 찾아서 눌러야해서 우선 listAdapter 를 통해서 클릭하고자하는 인덱스를 찾아냈습니다.
그리고 아쉽게도 발생시키고 싶은 클릭 리스너가 뷰홀더 전체가 아니라 뷰홀더 내부에 있는 특정 layout에 클릭이벤트를 적용해놔서 아래처럼 처리했습니다.
val index = listAdapter!!.list.indexOfFirst { data -> data.name == "찾고자하는 데이터 이름" }
val viewHolder = binding.rvList.findViewHolderForAdapterPosition(index)!! as FilterAdapter.FilterViewHolder
viewHolder.binding!!.layoutFilter.callOnClick()
생각보다 유용했다 chat GPT...!
반응형
'SW Programming > Android' 카테고리의 다른 글
[안드로이드] 카드뷰, 무한로딩, View pager transformation (0) | 2022.08.18 |
---|---|
sonarLint / Android의 코루틴 권장사항 (0) | 2022.08.08 |
[Android] 중첩된 리스트 사용시 스크롤 민감도 조절해보기(가로, 세로 스크롤) (0) | 2022.05.20 |
Android 단말에서 온갖 이벤트를 모니터링, 제어하고 싶다. adb shell getevent (0) | 2021.03.23 |
IOS 안드로이드 스튜디오 업데이트 오류 해결 (0) | 2017.06.15 |
댓글