컴공과컴맹효묘의블로그

Android- RecyclerView 라이브러리 본문

컴퓨터/Android Studio

Android- RecyclerView 라이브러리

효묘 2022. 3. 5. 00:27
반응형

RecyclerView

RecyclerView란 대량의 데이터들을 효율적으로 표시해주는 라이브러리다.

RecyclerView는 RecyclerView라이브러리의 클래스이다.

RecyclerView는 항목이 화면에서 벗어나더라도 뷰를 제거하지 않는다. 대신 RecyclerView에서 스크롤된 항목을 재사용한다. 이러면 앱의 응답성을 개선하고 전력 소모를 줄여준다.

Key classes

  • RecyclerView는 데이터를 담은 뷰들의 집합인 ViewGroup이다. RecylcerView는 뷰 그 자체이므로 다른 UI를 추가하는 것 처럼 layout에 추가하면 된다.
  • 리스트의 각 요소들은 view holder 객체에 의해 정의된다. view holder객체가 생성될 때 어떤 데이터랑도 관련이 없다. view holder가 생성되고 난 후에는 RecyclerView가 viewholder를 데이터에 바인딩 한다. RecyclerView.ViewHolder를 확장해서 view holder를 정의할 수 있다.
  • RecyclerView는 adapter를 통해서 데이터를 바인딩하거나 뷰를 request한다.RecylcerView.Adapter를 확장하여 어댑터를 정의할 수 있다.
  • layout manager는 리스트의 각 요소들을 정리해준다. RecyclerView 라이브러리에서 제공하는 layout manager를 사용할 수 있고, 사용자 정의 레이아웃을 사용할 수도 있다. 모든 layout manager들은 LayoutManager 추상 클래스를 베이스로 한다.

Adapter 코드

class MyAdapter(val datas: MutableList<String>): RecyclerView.Adapter<RecyclerView.ViewHolder>() {

    override fun getItemCount(): Int = datas.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder = MyViewHolder(ItemMainBinding.inflate(
        LayoutInflater.from(parent.context)))

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        Log.d("myLog", "onBindViewHolder: $position")
        val binding = (holder as MyViewHolder).binding

        binding.itemData.text = datas[position]

        binding.itemRoot.setOnClickListener {
            Log.d("myLog", "itemRoot clicked! $position: ${binding.itemData.text}")
        }
    }
}

Holder 코드

class MyViewHolder(val binding: ItemMainBinding): RecyclerView.ViewHolder(binding.root) {

}

Activity 코드

val ctx = this // fragment라면 val ctx = activity?.applicationContext
binding.recyclerView.layoutManager = LinearLayoutManager(ctx)
binding.recyclerView.adapter = MyAdapter(datas)
binding.recyclerView.addItemDecoration(DividerItemDecoration(ctx, LinearLayoutManager.VERTICAL)) // not essential

Item decoration

아이템 데코레이션은 리사이클러 뷰를 다양하게 꾸밀 때 사용한다. 라이브러리에서 제공하는 아이템 데코레이션은 DividerItemDecoration만 존재한다.

아이템 데코레이션은 ItemDecoration을 상속받아 다양한 꾸미기 작업이 가능하다.

// ItemDecoration 상속
class MyDecoration(val context: Context): RecyclerView.ItemDecoration() {
    override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State) {
        super.onDraw(c, parent, state)
    }
    override fun onDrawOver(c: Canvas, parent: RecyclerView, stgate: RecyclerView.State) {
        super.onDrawOver(c, parent, state)    
    }
    override fun getItemOffsets(
        outRect: Rect,
        view: View,
        parent: RecyclerView,
        state: RecycvlerView.State
    ) {
        super.getItemOffsets(outRect, view, parent, state)    
    }
}

공식 문서

반응형
Comments