반응형
Recent Posts
Recent Comments
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
Archives
Today
Total
관리 메뉴

Bbaktaeho

[Android] ListView 에서 ViewHolder 패턴 적용하기 (Kotlin, 리스트뷰, Adapter, ViewHolder) 본문

개발 (Develop)/안드로이드 (Android)

[Android] ListView 에서 ViewHolder 패턴 적용하기 (Kotlin, 리스트뷰, Adapter, ViewHolder)

Bbaktaeho 2020. 10. 13. 02:28
반응형

들어가며


이전 포스팅에서 연장되는 글입니다. 아래 포스팅을 참고하시고 따라와 주세요.

 

Java로 ListView 맛보기

bbaktaeho-95.tistory.com/66?category=782684

 

[Android] ListView 사용하기 (안드로이드, 리스트뷰, Adapter)

들어가며 ListView를 사용해서 과일 리스트를 나타내 보겠습니다. 각각의 아이템인 과일을 클릭했을 때 이벤트 리스너를 통해서 어떤 아이템이 선택되었는지 TextView에 나타내 보겠습니다. ListView L

bbaktaeho-95.tistory.com

Kotlin으로 Custom ListView 맛보기

bbaktaeho-95.tistory.com/76

 

[Android] Custom ListView 사용하기 (Kotlin, 리스트뷰, adapter)

들어가며 이전에 ListView를 android 기본 아이템 레이아웃을 활용하여 나타냈습니다. 이번 포스팅은 Java가 아닌 Kotlin으로 직접 아이템 뷰를 만들고 BaseAdapter를 상속받아서 커스텀 어댑터까지 구현��

bbaktaeho-95.tistory.com

ViewHolder?


 

ViewHolder란 현재 화면에서 보이는 아이템 개수만큼만 생성되고 스크롤이 발생하면 ViewHolder를 재사용한 후 데이터만 바꿔주기 때문에 앱의 효율이 향상됩니다.

 

override fun getView(position: Int, view: View?, parent: ViewGroup?): View {
	var convertView = view
	if (convertView == null) convertView = LayoutInflater.from(parent?.context).inflate(R.layout.custom_list_item, parent, false)

	val item: ListViewItem = items[position]
	convertView!!.image_title.setImageDrawable(item.icon)
	convertView.text_title.text = item.title
	convertView.text_sub_title.text = item.subTitle

	return convertView
}

 

convertView 변수가 비어있을 때만 새롭게 inflate 되므로 View 객체를 재활용하게 되어있습니다.

하지만 뷰의 속성들의 id를 찾는 것은 계속해서 반복됩니다. 즉, findViewById() 메서드가 아이템마다 호출된다는 것입니다. 코틀린에서 findViewById() 메서드를 사용하지 않는 것처럼 보이지만 실제로는 생략되어 있습니다. 

뷰의 깊이가 심하게 깊거나 자식이 많은 경우가 아니라면 findViewById()가 호출되는 시간은 크게 염려할 수준은 아닙니다.
- hashcode.co.kr/users/1713/leonardo-yonguk-kim

조금이라도 성능 개선을 위해서 ViewHolder 패턴을 적용해보겠습니다.

ViewHolder 패턴 적용하기


패키지 우클릭 -> New -> Kotlin File/Class 클릭

 

CustomViewHolder 클래스 생성하고 아래와 같이 작성합니다.

class CustomViewHolder {
    var drawableIcon: ImageView? = null
    var textTitle: TextView? = null
    var textSubTitle: TextView? = null
}

getView 메서드를 아래와 같이 수정합니다.

override fun getView(position: Int, view: View?, parent: ViewGroup?): View? {
        var convertView = view
        var viewHolder: CustomViewHolder
        if (convertView == null) {
            convertView = LayoutInflater.from(parent?.context).inflate(R.layout.custom_list_item, parent, false)
            viewHolder = CustomViewHolder()
            viewHolder.drawableIcon = convertView.image_title
            viewHolder.textTitle = convertView.text_title
            viewHolder.textSubTitle = convertView.text_sub_title
        }else {
            viewHolder = convertView.tag as CustomViewHolder
        }
        val item: ListViewItem = items[position]
        viewHolder.drawableIcon?.image_title?.setImageDrawable(item.icon)
        viewHolder.textTitle?.text_title!!.text = item.title
        viewHolder.textSubTitle?.text_sub_title!!.text = item.subTitle

        return convertView
}

view가 비어있을 때 viewHolder 객체를 생성해서 widget을 설정해주고 비어있지 않다면 저장된 viewHolder 객체를 가져와서 재사용이 가능해집니다.

참고 자료


hjiee.tistory.com/entry/Android-ViewHolder%ED%8C%A8%ED%84%B4%EC%9D%84-%ED%99%9C%EC%9A%A9%ED%95%9C-Base-ListView-%EB%A7%8C%EB%93%A4%EA%B8%B0

 

[Android] ViewHolder패턴을 활용한 Base ListView 만들기

2019.09.20 개발하면서 경험했던 것을 정리한 포스트입니다. 오류 지적이나 제안 언제든지 환영합니다. 안녕하세요. 이번 포스팅에서는 ListView 혹은 RecyclerView에서 Adapter를 매번 만들어 써야 하는 ��

hjiee.tistory.com

itpangpang.xyz/274

 

setTag, getTag 사용하기(1) - findViewWithTag

setTag, getTag 사용하기(1) findViewWithTag ㆍ 이번글을 시작으로 Tag에 대해 한 3~4번정도 글을 쓰면서 알아보려고 합니다 ㆍ setTag, getTag를 잘 사용하면 View를 정말 효율적으로 제어할 수 있습니다. ㆍ..

itpangpang.xyz

 

반응형