210202
[Kotlin] RecyclerView를 ListView의 단일선택처럼 사용하기 본문
RecyclerView에서는 android:choiceMode를 사용할 수 없다. 따라서 사용자가 직접 정해주어야한다.
내가 구현한 방식은 다음과 같다.
1. RecyclerView 객체에 addOnItemTouchListener를 달아준다.
2. onInterceptTouchEvent 함수(터치 이벤트 발생시 처리)에 이벤트 처리를 해준다.
구현코드
binding.recyclerview.addOnItemTouchListener(object :
RecyclerView.OnItemTouchListener {
override fun onTouchEvent(rv: RecyclerView, e: MotionEvent) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
override fun onInterceptTouchEvent(rv: RecyclerView, e: MotionEvent): Boolean {
if(e.action == MotionEvent.ACTION_MOVE){
}
else{
var child = rv.findChildViewUnder(e.getX(), e.getY())
if(child != null){
var position = rv.getChildAdapterPosition(child)
var view = rv.layoutManager?.findViewByPosition(position)
view?.setBackgroundResource(R.color.colorAccent)
for(i in 0..rv.adapter!!.itemCount){
var otherView = rv.layoutManager?.findViewByPosition(i)
if(otherView != view){
otherView?.setBackgroundResource(R.color.colorPrimaryDark)
}
else{
}
}
}
}
return false
}
override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
TODO("not implemented") //To change body of created functions use File | Settings | File Templates.
}
})
Activity의 OnCreate 부분에서 작성된 코드이다. 데이터바인딩을 통해 recyclerview를 가져왔다.
주의깊게 봐야할 부분은 다음과 같다.
1. e.action == MotionEvent.ACTION_MOVE
2. for(i in ~)
1번은 이벤트가 터치 후 움직이는 이벤트이면 배경색을 전환하지 않기위해 구현한 코드이다. 이 부분이 없으면 스크롤을 내리거나 올릴때마다 해당하는 아이템에 배경색이 바뀌게 된다.
2번은 터치된 아이템의 배경색이 바뀌면 나머지 아이템들의 배경색은 원래대로 돌아와야하기 때문에 나머지 아이템들의 배경색들을 바꿔주는 코드이다.
rv.layoutManger.findViewByPosition 함수에 0부터 아이템의 개수만큼 반복시켜 View들을 가져온 후 해당 View가 터치된 아이템의 View가 아니라면 배경색을 바꾸는 방식이다.
참고사이트
MotionEvent 관련
ItemPosition 구하기
https://altongmon.tistory.com/426
RecyclerView에서 해당 아이템의 View 가져오기
'Android' 카테고리의 다른 글
[Kotlin] EditText의 엔터(<┘)를 완료로 바꾸기 + EditText에 내용이 없을 때 버튼을 못누르게 하기 (0) | 2020.05.19 |
---|---|
[Kotlin] 움직이는(GIF) ProgressDialog로 로딩처리 (2) | 2020.05.16 |
Kotlin 데이터 바인딩과 네비게이션을 사용하여 프래그먼트 구현 + 몇가지 오류들 해결 (0) | 2020.03.09 |
Kotlin으로 Facebook 소셜 로그인 구현 + 유저 데이터 가져오기 (0) | 2020.03.08 |
T Map API 다중마커 구현 + 풍선뷰 이벤트 처리(풍선뷰 누를 시 마커삭제) (0) | 2020.02.24 |
Comments