Android 앱의 성능 개선②(RecyclerView.Adapter)
6814 단어 안드로이드RecyclerView성능
개선 대상
목록 등을 보려면 RecyclerView를 사용할 수 있다고 생각합니다.
RecyclerView는 매우 유용한 클래스이지만 성능에는주의가 필요합니다.
측정
아래의 RecyclerView를 사용한 캘린더의 성능을 Systrace을 사용하여 측정했습니다.
그러면 Adapter onCreateViewHolder의 inflate에 시간이 걸리고 있다 (아래의 경우는 15.506ms) 것을 알았습니다.
onCreateViewHolder는 RecyclerView의 item 수만 호출되므로 onCreateViewHolder에 시간이 걸리면 성능에 상당한 영향을 미칩니다.
개선 방법
개선에는 RecyclerView의 item 생성에 inflate를 사용하지 않고 View를 생성(CustomView)하는 방법이 있습니다.
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): DateAdapterHolder {
- val view = inflater.inflate(R.layout.calendar_item, parent, false)
- return DateAdapterHolder(view)
+ return DateAdapterHolder(
+ CalenderItemView(parent.context).apply {
+ layoutParams = LinearLayout.LayoutParams(parent.width / 7, ITEM_HEIGHT.toInt())
+ }
+ )
}
CalenderItemView.kt
class CalenderItemView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null,
defStyle: Int = 0
) : LinearLayout(context, attrs, defStyle) {
companion object {
private val TEXT_SIZE = 20f.sp
private val MARGIN_SIZE = 5f.sp
val ITEM_HEIGHT = TEXT_SIZE + MARGIN_SIZE * 2
private val textPaint = Paint().apply {
textSize = TEXT_SIZE
}
}
var date: String = ""
var color: Int = Color.BLACK
init {
gravity = Gravity.RIGHT
setBackgroundColor(Color.WHITE)
}
override fun onDraw(canvas: Canvas?) {
super.onDraw(canvas)
textPaint.color = color
canvas?.drawText(
date,
if (date.length == 1) TEXT_SIZE / 2 else 0f.sp,
TEXT_SIZE + MARGIN_SIZE,
textPaint
)
}
}
이 수정으로 onCreateViewHolder의 시간(Systrace에서 측정)이 1/10(평균 6.638ms에서 0.735ms)으로 개선되었습니다.
구현에 대한 자세한 내용은 아래를 참조하십시오.
htps : // 기주 b. 코 m / 요시 히로 카토 / 안 d 로이 d 사 mp ぇ s / t 네 / 4 8 또는 216 71bf4f147 854 4 8872b889639 3 온
보충
CustomView로 하면 Canvas에 텍스트나 Bitmap을 직접 그리게 되므로 TextView의 ellipsize 등을 사용할 수 없게 됩니다.
Reference
이 문제에 관하여(Android 앱의 성능 개선②(RecyclerView.Adapter)), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yoshihiro-kato/items/18b2c0178feae6341be7텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)