타이탄의 도구들

[Android] ListView, RecyclerView, Lazy lists 본문

Dev Tools/Android

[Android] ListView, RecyclerView, Lazy lists

Titan04 2022. 5. 28. 10:29
728x90

안드로이드에서 리스트를 표현하는 대표적인 3가지 방법인

ListView, RecyclerView, LazyColumn에 대해 알아보도록 하겠습니다.

 

ListView

사전적 의미

List : 목록

View : 그림, 보기, 시야

목록을 나타내는 것

고유명사적 의미

데이터를 특정한 형식에 따라 차례대로 뷰를 나열하는 방식

차례로 나열되는 자료를 표현하기 위해 사용하는 뷰

데이터 목록을 아이템 단위로 구성하여 화면에 출력하는 ViewGroup의 한 종류

왜 사용하는가?

데이터를 일정한 규칙으로 표현해 알아보기 쉽도록 하기 위해서

+

리스트뷰는 리사이클러뷰가 있는데 왜 deprecated 되지 않았을까?

→리스트뷰만의 여러 장점이 있기 때문에

리스트뷰의 장점

-ListView는 간단하게 리스트를 만드는 부분에 있어서는 장점을 가지고 있다. [ex) 텍스트만 있는 리스트]

-간단한 아이템 형태를 만드는 경우에는 빠르게 적용이 가능한 ArrayAdapter를 제공합니다.

-뷰홀더 패턴을 이용할 필요가 없습니다.

-목록의 개별 항목에 대한 클릭 이벤트에 바인딩하기 위한

AdapterView, OnItemClickListener 인터페이스가 있습니다.

RecyclerView

사전적 의미

Recycler : 재활용하는 사람, 재생 처리기

재생 처리 : 더러운 것을 깨끗이 하여 다시 쓸 수 있도록 하는 일.

View : 그림, 보기, 시야

이전에 썼던 뷰를 다시 쓸 수 있도록 하는 방식

고유명사적 의미

데이터만 교체하고, 이전에 썼던 뷰(아이템)를 재사용할 수 있게 하여 데이터를 나열하는 방식

사용자가 관리하는 많은 수의 데이터 집합(Data Set)을 개별 아이템 단위로 구성하여

화면에 출력하는 뷰그룹(ViewGroup)이며,

한 화면에 표시되기 힘든 많은 수의 데이터를 스크롤 가능한 리스트로 표시해주는 방식

왜 사용하는가?

리스트뷰(ListView)의 경우,

리스트 항목이 갱신될 때마다, 매번 아이템 뷰를 새로 구성해야 합니다.

이는 "많은 수의 데이터 집합을 표시"하는데 있어서, 성능 저하를 야기할 수 있는 요인이 됩니다.

이러한 리스트뷰의 단점을 참고하여,

리사이클러뷰는 아이템을 표시하기 위해 생성한 뷰를 재활용하고

데이터만 변경해주는 방식을 사용해 성능 저하를 최소화 해주는 장점 때문에 사용합니다.

리스트뷰와 리사이클러뷰 비교표

 

Lazy lists (LazyRow, LazyColumn)

 

사전적 의미

Lazy : 늦은, 게으른

List : 목록

Row : 가로(행)

Column : 세로(열)

 

지연 (초기화) 목록

 

고유명사적 의미

 

Jetpack Compose에서 리스트를 표현할 때 단순 Row나 Column 레이아웃 만으로 표현이 어려운 상황

(예를들어, 리스트의 수가 매우 많거나 알 수 없을 때)에서 사용하는 방법입니다.

Lazy라는 수식이 붙은 이유는 2가지를 예상해 볼 수 있습니다.

첫번째로

레이아웃과 스크롤 포지션에 따라 유연하게 아이템(행,열)을 '나중에(늦게)' 추가하는 방식이어서

Lazy라는 표현이 붙었다고 예상할 수 있습니다.

두번째로

Kotlin 언어의 lazy 처럼 스코프({}) 안에서 람다를 통해 파라미터를 받고, 바디를 구현해 리턴값이 결정되는

형태로 구현됐기 때문이라고 예상할 수 있습니다.

 

<Kotlin lazy 코드>

val lazyValue: String by lazy {
    println("computed!")
    "Hello"
}

 <Compose Lazy Column 코드>

import androidx.compose.foundation.lazy.items

@Composable
fun MessageList(messages: List<Message>) {
    LazyColumn {
        items(messages) { message ->
            MessageRow(message)
        }
    }
}

 

728x90
Comments