반응형
안드로이드에서 데이터 리스트를 화면에 보여주는 뷰(View)로는 ListView와 RecyclerView가 있습니다.
이 두 뷰의 차이점을 알아보고, 어떤 상황에서 어떤 뷰를 사용해야 하는지 살펴보겠습니다.
목차
- ListView란?
- RecyclerView란?
- ListView와 RecyclerView의 차이점
- 샘플 코드 비교
- 결론
1. ListView란?
- 안드로이드에서 제공하는 뷰(View) 중 하나로, 리스트 형태의 데이터를 화면에 보여주는 역할을 합니다.
- 한 번에 모든 아이템을 불러오기 때문에, 데이터가 많을 경우 성능 이슈가 발생할 수 있습니다.
2. RecyclerView란?
- 안드로이드에서 제공하는 뷰(View) 중 하나로, 리스트 형태의 데이터를 화면에 보여주는 역할을 합니다.
- ListView보다 더 유연하게 리스트 아이템을 구성할 수 있으며, 성능 개선을 위한 여러 기능을 제공합니다.
- ViewHolder 패턴을 기반으로 한 아이템 재사용 방식을 사용해 성능 개선을 할 수 있습니다.
- 데이터가 많을 경우, 일부 아이템만 불러오기 때문에 성능 이슈를 줄일 수 있습니다.
3. ListView와 RecyclerView의 차이점
- 아이템 재사용 방식: ListView는 모든 아이템을 불러오기 때문에, 스크롤 시에도 모든 아이템을 유지하며 화면에 보여줍니다. 반면 RecyclerView는 ViewHolder 패턴을 사용하여 화면에 보여지는 아이템만 재사용하므로, 성능 개선을 할 수 있습니다.
- 레이아웃 관리: ListView는 레이아웃을 수동으로 설정해야 하지만, RecyclerView는 레이아웃 관리자(Layout Manager)를 사용하여 레이아웃을 쉽게 설정할 수 있습니다. 레이아웃 관리자는 리스트를 가로로 배치하거나, 그리드 형태로 배치하는 등 다양한 레이아웃을 지원합니다.
- 어댑터(Adapter): 두 뷰 모두 어댑터를 사용하여 데이터를 화면에 표시합니다. RecyclerView는 어댑터에 추가로 ViewHolder를 사용하여 아이템을 재사용합니다.
- 애니메이션: RecyclerView는 아이템이 추가, 삭제, 이동할 때 애니메이션을 쉽게 지정할 수 있습니다. ListView에서는 애니메이션을 직접 지정해야 합니다. 예를 들어, 아이템이 추가될 때는 화면에서 위에서 아래로 떨어지는 애니메이션을 구현할 수 있습니다.
- 반면 RecyclerView에서는 ItemAnimator를 사용하여 애니메이션을 지정할 수 있습니다. 예를 들어, 아이템이 추가될 때는 기본적으로 화면에서 오른쪽에서 왼쪽으로 나타나는 애니메이션을 사용할 수 있습니다. 또한, ItemDecorator를 사용하여 아이템 사이에 여백을 주거나, 아이템에 그림자 효과를 추가하는 등의 레이아웃 처리를 할 수 있습니다.
4. 샘플 코드 비교
- ListView와 RecyclerView를 비교해보겠습니다.
/ ListView 예제 코드
class ListViewActivity : AppCompatActivity() {
private val listView: ListView by lazy { findViewById(R.id.list_view) }
private val adapter = MyListAdapter()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_list_view)
listView.adapter = adapter
}
inner class MyListAdapter : BaseAdapter() {
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var view = convertView
if (view == null) {
view = layoutInflater.inflate(R.layout.list_item, parent, false)
}
val item = getItem(position)
val titleView = view?.findViewById<TextView>(R.id.title)
titleView?.text = item.title
val subtitleView = view?.findViewById<TextView>(R.id.subtitle)
subtitleView?.text = item.subtitle
return view!!
}
override fun getItem(position: Int): ListItem {
return ListItem("Title $position", "Subtitle $position")
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getCount(): Int {
return 50
}
}
}
// RecyclerView 예제 코드
class RecyclerViewActivity : AppCompatActivity() {
private val recyclerView: RecyclerView by lazy { findViewById(R.id.recycler_view) }
private val adapter = MyListAdapter()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_recycler_view)
recyclerView.layoutManager = LinearLayoutManager(this)
recyclerView.adapter = adapter
}
inner class MyListAdapter : RecyclerView.Adapter<MyViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
val view = layoutInflater.inflate(R.layout.list_item, parent, false)
return MyViewHolder(view)
}
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val item = getItem(position)
holder.bind(item)
}
override fun getItemCount(): Int {
return 50
}
private fun getItem(position: Int): ListItem {
return ListItem("Title $position", "Subtitle $position")
}
}
inner class MyViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
private val titleView = itemView.findViewById<TextView>(R.id.title)
private val subtitleView = itemView.findViewById<TextView>(R.id.subtitle)
fun bind(item: ListItem) {
titleView.text = item.title
subtitleView.text = item.subtitle
}
}
}
5. 결론
- ListView와 RecyclerView는 모두 리스트 형태의 뷰를 구현할 수 있습니다.
- RecyclerView는 ListView에 비해 유연하고 성능이 우수합니다.
- RecyclerView는 ViewHolder 패턴과 ItemAnimator, ItemDecorator 등의 기능을 제공합니다.
- Kotlin을 사용하면 더 간결하고 가독성 높은 코드를 구현할 수 있습니다.
- 요즘은 ListView를 사용해야 하는 경우는 거의 없으며, RecyclerView를 사용하는 것이 좋습니다.
728x90
반응형
'개발 > Android' 카테고리의 다른 글
[Android] Context란? (0) | 2023.02.24 |
---|---|
[Android] RecyclerView를 동적으로 만들기 (0) | 2023.02.23 |
[Android] Targeting S+ (version 31 and above) requires that one of FLAG_IMMUTABLE or FLAG_MUTABLE be specified when creating a PendingIntent. 해결 (0) | 2023.02.21 |
[Android] kotlin-android-extensions deprecated (0) | 2023.02.20 |
[Android] Service와 IntentService의 차이점 (0) | 2023.02.17 |
댓글