버그 잡이

[코틀린] Kotlin RecyclerView 각 요소 살펴보기 본문

안드로이드/코틀린

[코틀린] Kotlin RecyclerView 각 요소 살펴보기

버그잡이 2020. 4. 2. 11:42

지금까지는 안드로이드를 공부할때 기능구현에만 중점을 두었다. 

이제부터는 각 기능의 요소를 한줄한줄 파헤치며 공부해보고자 한다.

(recyclerView 튜토리얼이 아니라 recyclerView 자체에 대한 이해를 높이고자 정리하는 글입니다.)

 

 

 

0. 구성요소

 

ViewHolder

- 개별 아이템의 View를 생성하여 제공한다.

 

Adapter

- 데이터를 관리하고 목록에 표시한다.

 

Activity

- UI로 recyclerView를 보여주는 클래스이다.

 

 

 

 

1. ViewHolder & Adapter

class MyAdapter(private val myDataset: Array<String>) :
        RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

  
    //개별 아이템에 view 생성하여 제공
    class MyViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView)


    //실제로 표현될 item view 생성
    override fun onCreateViewHolder(parent: ViewGroup,
                                    viewType: Int): MyAdapter.MyViewHolder {
        // 내가 표현하고 싶은(코드로 조작하고 싶은) 레이아웃을 inflate하고
        val textView = LayoutInflater.from(parent.context)
                .inflate(R.layout.my_text_view, parent, false) as TextView
    
    	//ViewHolder에 담아서 반환한다.
        return MyViewHolder(textView)
    }

    //item에 데이터를 바인딩한다. 화면에 들어온 아이템에 대해서만 작업을 진행
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        holder.textView.text = myDataset[position]
    }

    // item의 갯수를 반환한다.
    override fun getItemCount() = myDataset.size
}

 

* 요약

1) ViewHolder라는 객체를 통해서 각 항목을 나타낸다.

2) ViewHolder 위에 inflate를 통해서 내가 원하는 레이아웃을 표현하고 객체를 반환한다(onCreateViewHolder)

    * 화면에 표시될 갯수+알파 만큼만 생성된다.

3) 거기에 데이터를 넣어준다(onBindViewHolder)

 

 

 

 

"왜 뷰홀더를 사용하는가?"

 

- 이를 알기 위해선 기존 listView를 사용하던 시점으로 거슬러 올라가야 한다.

 

- 당시에는 ViewHolder라는 개념이 없었고 그냥 뷰를 inflate해서 사용했다. 이 경우 문제가 있었는데 "레이아웃의 각 요소를 가져오려면 일일히 findViewById를 해줘야했다."

 

- view의 세부정보를 담고 있는 Viewholder라는 개념을 도입해서 매번 findviewbyid를 해주지 않아도 세부 view를 가져올 수 있게 하였다.

 

*참조 : http://dudmy.net/android/2017/06/23/consider-of-recyclerview/ 

 

 

 

 

 

"최근 심화된 뷰홀더"

class ItemViewHolder(override val containerView: View)
    : RecyclerView.ViewHolder(containerView), LayoutContainer

1. 최근 코틀린 ViewHolder에서는 LayoutContainer를 상속받아 사용합니다. 
- 이를 활용하면 컴파일시 내부적으로 view의 내용을 캐시하는 코드를 생성하여 좀 더 빠른 화면출력이 가능하다고 합니다.

https://proandroiddev.com/kotlin-android-extensions-using-view-binding-the-right-way-707cd0c9e648

 

 

2. 그리고 코틀린에서는 ViewHolder를 adapter에서 따로 분리해 클래스를 만들어 사용합니다.

 - 코틀린에서는 이렇게 분리해도 다른 adapter에서 호환이 되기 때문에 이렇게 하나 만들어 놓고 다른 adapter에서 가져다 사용할 수 있습니다.

 

 

 

 

2. Activity

class MyActivity : Activity() {
        private lateinit var recyclerView: RecyclerView
        private lateinit var viewAdapter: RecyclerView.Adapter<*>
        private lateinit var viewManager: RecyclerView.LayoutManager

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.my_activity)

            viewManager = LinearLayoutManager(this)
            viewAdapter = MyAdapter(myDataset)

            recyclerView = findViewById<RecyclerView>(R.id.my_recycler_view).apply {
                
                setHasFixedSize(true) //리사이클러뷰 크기 고정. 
                //이유는 itemdl 추가,삭제시 recyclerView 크기가 계속 변경된다면 다른 view들에 영향을 미칠수 있다.  
                
                layoutManager = viewManager	//레이아웃 매니저 셋팅

                adapter = viewAdapter	//아답터 셋팅

            }
        }
        // ...
    }

* Activity는 레이아웃 매니저어댑터생성하고 연결해주는 곳이다.

 

 

 

 

 

 

 

 

 

*참고자료(유튜브 코딩메이트 디모)

https://www.youtube.com/watch?v=lJGmRodM1vk&list=PLQdnHjXZyYafR57vhXjmw2h3YEl0dM0zC&index=13

 

반응형
Comments