ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Recycler View] View Holder
    Android📱 2022. 3. 29. 17:52

    View Holder

    Recycler View에서 빼먹을수 없는 개념중 View Holder가 있다.

    오늘은 Recycler View 시리즈 2

    View Holder에 대해 공부해 본다.

    View Holder란?

    View Holder는 Hold 잡고 있다라는 표현과 일치되는 부분이 많다.

    이름 그대로 뷰의 데이터를 잡고 있는, 갖고 있는 객체라고 생각하면 좋을듯하다.

    이게 무슨소리일까?

    List View에서 레이아웃을 재활용할때 뷰를 가져오기 위해서 getView에서 findViewById를 통해 Item View의 요소들을 탐색을 하는데,

    이 과정이 반복 되면서 성능 저하가 발생을 한다.

    그런데 Recycler View는 이런 성능 저하가 없다고 했습니다.

    그 이유가 바로 View Holder때문이다.

    Recycler View는 View Holder를 강제로 만들도록 구현이 되어있기 때문에 무조건 View Holder를 사용하게 되어서

    List View에서 말한 성능 저하가 적다고 이야기를 하는 것이다.

    실제로 코드를 보면

    
    ListAdapter<ImageData, AdapterDoodle.MyViewHolder>(DoodleDiffCallBack)
    
    RecyclerView.Adapter<RecyclerAdapter.Holder>() 
    

    ListAdapter나 RecyclerView.Adapter를 상속받아서 구현할때 <> 안에 ViewHolder를 넣어주지 않으면 오류가 발생하는 것을 볼 수 있다.

    그리고 강제로 오버라이드 해야하는 메소드들도 onCreateViewHolder(), onBindViewHolder() 이름부터 ViewHolder인 것을 볼 수 있다.

    사용

    그래서 Holer를 어떻게 쓰는 걸까?

    View Holder는 RecyclerView.ViewHolder를 상속 받아서 사용해 주면되고 list View는 클래스를 만들어 주면되는데 그부분은 다루지 않도록 하겠다.

    RecyclerView.ViewHolder를 상속받아서 ViewHolder를 구현하면 인자로 onCreateViewHolder()에서 아이템뷰를 넘겨서 리턴을 해준다.
    그리고 onBindViewHolder가 동작할때 position을 이용해서 리스트에서 현재 보여져야하는 데이터를 받아서 holder.bind를 통해서 ViewHolder에 데이터를 넘겨주어 뷰에 데이터를 넣어준다.

    inner class Holder(itemView: View?) : RecyclerView.ViewHolder(itemView!!) {
            private val photo = itemView?.findViewById<ImageView>(R.id.image)
            val name = itemView?.findViewById<TextView>(R.id.name)
            private val age = itemView?.findViewById<TextView>(R.id.age)
            private val gender = itemView?.findViewById<TextView>(R.id.gender)
    
            fun bind (students: Students, context: Context) {
    
                if (students.photo != "") {
                    val resourceId = context.resources.getIdentifier(students.photo, "drawable", context.packageName)
                    photo?.setImageResource(resourceId)
                }
                else {
                    photo?.setImageResource(R.mipmap.ic_launcher)
                }
    
                name?.text = students.name
                age?.text = students.age.toString()
                gender?.text = students.gender
    
                Log.d("RecyclerAdapter", "bind")
            }
        }
    
        override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
            val view = LayoutInflater.from(context).inflate(R.layout.recycler_view_item, parent, false)
            Log.d("RecyclerAdapter", "onCreateViewHolder")
            return Holder(view)
        }
    
        override fun onBindViewHolder(holder: Holder, position: Int) {
            Log.d("RecyclerAdapter", "onBindViewHolder")
            holder.bind(students[position], context)
        }
    
    

    전체 코드

    ViewHolder를 잘 이해하면 Recycler View를 이해할때 도움이 될것같다.

Designed by Tistory.