android recyclerview with multi item binding

 채팅 예제 하나 올려 볼라고 시작한 일이 커졌다.


기존 소스가 activity 로만 되어 있어 fragment 로 변경하고 viewbinding 을 적용해 볼려고 시작했는데

recyclerview 를 한번 정리하게 되었고 

글찾아보니 제대로 동작하는 소스가 없어서 나도 하나 만들어 보았다.


이제 내가 만든 소스 기준으로 adapter 에 multi type itembindingview 를 적용해 보도록 한다.


소스의 시작은 recyclerview02 소스를 가지고 시작한다.

https://github.com/wkyoon/Recyclerview02.git


모든 내용은 동일하다. 단지 recyclerview 에 들어가는 item 의 view type 이 하나가 아니고 둘이라는게 다른 내용이다.


우선 activity_main.xml 에 있는 recyclerview 부분부터 수정한다.


tools:listitem 을 삭제한다.

single type 의 item 을 가질때는 위와 같이 xml 에 선언해서 사용하는것이 편하다.

하지만 mutil type 인 경우는 위와 같이 사용하면 안된다.

( 삭제를 하고 그냥 실행해도 결과는 똑같다. 그냥 무시해도 되는거 보다)


일단 이걸 할려고 하면 

sealed class 를 알아야 한다.

inner class로 사용하는 ViewHolder 로 해결해 보고 싶었지만 그렇게 되지는 않는 것같다.


https://kotlinworld.com/165

sealed class 를 별도로 만들어서 처리하는 방법을 참조하도록 한다.


그리고, 다른 예제

https://www.section.io/engineering-education/implementing-multiple-viewholders-in-android-using-kotlin/

이게 이해 하기 제일 편할것 같다.

다른 분들건 너무 내용이 복잡하다.


sealed class 를 사용해 해야 하는 것은 이해 하겠지만 이걸 어떻게 adapter 에 적용할 건지에 대해 간단히 설명 한 내용이 없다.


적용 내용은 간단하다.

1. 기존에 inner class 로 구현한 ViewHolder 를 삭제한다.

2. sealed class 형태로 ViewHoder 를 구현한다.


나의 경우는 표현할 item 형태가 2개 여서 class 를 2개 구현하였고 binding 을 
ItemRecyclerExBinding
ItemRecyclerEx02Binding
이렇게 선언하여 적용하였다.

3. adapter 를 다시 구성한다.
신규로 만든 ProfileAdapterViewHolder 를 적용한다. 

나는 나이로 25세 이상이면 OLDER 를 적용 어리면 YOUNGGER 를 적용하도록 하였다.


위에 이미지를 보면 숫자가 있는데 순서라고 보면 된다.

이전 소스에는 getItemViewType 이 없었다 

data 에서 정보를 가져와서 보여줄 layout 을 결정해 준다고 보면 된다.


그리고, onCreateViewHolder 를 호출한다고 보면 된다. 

viewtype 이 결정되어서 넘어오니깐 그때 viewbinding 을 전달해 준다.

그리고, onBinding 에서 holder 를 보고 ( view binding 된 holder 를 보고) data를 binding 하여 setting 한다.



결과 이다. 
소스는 


viewbinding 적용은 여기까지 알면 그냥 다른건 이거 보단 적용하기 쉬울 것이다.





















댓글

이 블로그의 인기 게시물

mount 명령 ( 읽기 권한만 있는놈 쓰기 권한 주기 )

c# mqtt client example

비글본 블랙 고정 아이피 설정