글

라벨이 RecyclerView인 게시물 표시

Android RecyclerView에서 Jetpack Compose LazyColumn으로 이전하기: ViewBinding·ListAdapter 비교

이미지
Android RecyclerView에서 Jetpack Compose LazyColumn으로 이전하기 기존 XML 화면의 RecyclerView , ViewBinding , ListAdapter 를 Jetpack Compose로 옮길 때 가장 중요한 변화는 어댑터를 새 문법으로 바꾸는 것 이 아닙니다. ViewHolder가 화면 상태를 직접 갱신하던 구조를 버리고, 하나의 UI 상태를 Composable 함수에 전달하는 구조로 바꾸는 것이 핵심입니다. 이 글에서는 즐겨찾기 가능한 사용자 목록을 예제로 다음 과정을 한 번에 연결합니다. ListAdapter 와 DiffUtil 을 LazyColumn 의 items() 로 전환 ViewModel 의 StateFlow 를 생명주기에 맞게 수집 안정적인 key 로 스크롤 위치와 아이템 상태 보존 로딩·빈 목록·오류·정상 목록을 하나의 상태 모델로 처리 기존 Fragment에 ComposeView 를 넣어 화면을 단계적으로 이전 Compose UI 테스트로 클릭 결과 확인 이 글은 2026년 7월 Android 공식 문서를 기준으로 작성했습니다. Compose와 AndroidX 버전은 고정 숫자를 복사하기보다 프로젝트의 최신 안정 Compose BOM과 공식 릴리스 정보를 확인하세요. RecyclerView와 LazyColumn은 무엇이 다른가 둘 다 화면에 보이는 항목 중심으로 UI를 구성하므로 긴 목록에 적합합니다. 그러나 개발자가 관리하는 책임은 크게 다릅니다. RecyclerView 기반 구현 Compose 기반 구현 달라지는 책임 XML 아이템 레이아웃 @Composable 아이템 함수 레이아웃과 바인딩 로직을 Kotlin 함수로 통합 RecyclerView.ViewHolder 별도 객체 없음 현재 상태를 받아 UI를 선언 ListAdapter LazyColumn 목록 배치와 지연 구성 담당 DiffUtil.ItemCallback ...

Android RecyclerView 여러 아이템 타입 구현: sealed class와 ViewBinding

이 글은 2022년에 작성한 RecyclerView 다중 아이템 예제를 현재 Android 개발 방식에 맞춰 전면 개정한 글입니다. 기존 URL과 주제는 유지하면서 스크린샷 대신 복사해 적용할 수 있는 Kotlin 코드, ListAdapter , DiffUtil , ViewBinding을 사용합니다. 채팅 목록에는 내가 보낸 메시지와 상대방 메시지가 서로 다른 모양으로 나타납니다. 피드에는 본문뿐 아니라 날짜 구분선, 광고, 로딩 상태가 함께 들어갑니다. 이렇게 하나의 RecyclerView 에 여러 레이아웃을 표시하려면 데이터의 종류와 화면의 종류를 명확히 연결해야 합니다. 핵심은 세 가지입니다. sealed interface 로 화면에 나타날 데이터 종류를 제한한다. getItemViewType() 에서 각 데이터 종류를 정수 타입으로 변환한다. onCreateViewHolder() 와 onBindViewHolder() 에서 같은 규칙을 사용한다. 먼저 보는 핵심 데이터 타입을 기준으로 ViewHolder를 선택하고, ViewBinding으로 각 레이아웃을 안전하게 참조합니다. 목록 갱신은 notifyDataSetChanged() 대신 ListAdapter 와 DiffUtil 에 맡깁니다. 질문 답 여러 레이아웃은 어디서 구분하나? getItemViewType() 레이아웃은 언제 생성하나? onCreateViewHolder() 데이터는 언제 표시하나? onBindViewHolder() 목록 변경은 어떻게 계산하나? ListAdapter 와 DiffUtil.ItemCallback 클릭 시 position을 저장해도 되나? 저장하지 말고 현재 바인딩한 item을 전달 완성할 예제 예제 목록에는 다음 세 종류의 행이 들어갑니다. 날짜를 표시하는 헤더 내가 보낸 메시지 상대방이 보낸 메시지 데이터가 isMine: Boolean 같은 플래그 하나에 의존하도록 만들 수...