일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- as?
- golang
- 자바스크립트
- Java
- 오버로딩
- Array
- HP
- Overloading
- Android
- adapter
- 함수
- 패널 교체
- 리스트 뷰
- js
- Python
- 노트북
- Kotlin
- 안드로이드
- 파이썬
- 코틀린
- 연산자
- go
- 싱글 스레드
- var
- ListView
- node.js
- 배열
- javascript
- 자바
- 노트북 추천
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
Kotlin으로 Custom ListView 맛보기
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 객체를 가져와서 재사용이 가능해집니다.
참고 자료
반응형