RecyclerView

BongKu·2023년 6월 17일
0

Android

목록 보기
4/30
post-thumbnail

RecyclerView ?

RecyclerView는 아이템을 동적으로 추가, 제거, 재배치할 수 있으며, 스크롤 가능한 목록을 표시하기 위해 사용됩니다. 이를 통해 대용량의 데이터 세트를 처리하고, 화면에 보이는 아이템만 렌더링하여 메모리와 처리 리소스를 효율적으로 관리할 수 있습니다. 따라서 항목이 스크롤되어 화면에서 벗어나더라도 view를 제거하지 않고, 화면에서 스크롤된 새 항목의 뷰를 재사용합니다.

RecyclerView 핵심 컴포넌트

  • RecyclerView : 아이템 목록을 표시하는 컨테이너 역할을 합니다. XML 레이아웃 파일에서 RecyclerView를 정의하고, 액티비티나 프래그먼트에서 해당 뷰를 참조하여 사용합니다.

  • LayoutManager : 아이템의 배치와 스크롤 동작을 관리합니다. RecyclerView는 다양한 레이아웃 관리자를 지원하며, LinearLayoutManager, GridLayoutManager, StaggeredGridLayoutManager 등이 있습니다. 각 레이아웃 관리자는 아이템을 어떤 형태로 배치할지 결정합니다.

    LinearLayoutManager : 수평 또는 수직으로 아이템을 선형으로 배치합니다.
    GridLayoutManager : 그리드 형태로 아이템을 배치합니다.
    StaggeredGridLayoutManager : 그리드 형태로 아이템을 배치하지만, 각 아이템의 크기가 다를 수 있습니다.

  • Adapter : RecyclerView와 데이터 소스 간의 중개자 역할을 합니다. 데이터를 아이템으로 변환하여 RecyclerView에 제공하고, 각 아이템의 뷰를 생성하고 관리합니다. Adapter는 RecyclerView.Adapter 클래스를 상속받아 구현하며, 필수 메서드로 데이터 바인딩, 아이템 개수 반환, 뷰홀더 생성 등의 작업을 수행합니다.

  • ViewHolder : 각 아이템의 뷰와 데이터를 보유하고 재활용하는 역할을 합니다. RecyclerView.ViewHolder 클래스를 상속받아 구현하며, 아이템의 뷰와 데이터를 바인딩하여 표시합니다. 뷰 홀더는 Adapter에서 관리되며, 재활용을 통해 스크롤 동작 시에도 효율적으로 뷰를 표시할 수 있습니다.

예제

동작 순서

  1. RecyclerViewLayoutManager에게 아이템의 배치와 스크롤 동작을 위임합니다.
  2. LayoutManager는 필요한 아이템의 개수를 Adapter로부터 요청하고, 아이템의 뷰를 생성합니다.
  3. LayoutManager는 생성한 뷰를 ViewHolder에 바인딩하고, RecyclerView에 전달합니다.
  4. RecyclerView는 생성된 ViewHolder를 받아서 화면에 표시합니다. 이때, LayoutManager는 필요한 아이템만을 화면에 로드하여 효율적으로 메모리를 관리합니다. 스크롤 동작이 발생하면, LayoutManager는 새로운 아이템을 로드하거나 기존 아이템을 재사용하여 화면에 표시합니다.
  5. 사용자 인터랙션이 발생하면, RecyclerView는 해당 이벤트를 감지하고 이벤트를 처리하는 리스너들을 호출합니다. 예를 들어, 아이템 클릭, 스크롤, 드래그 등의 이벤트를 처리할 수 있습니다.
  6. 데이터가 변경되거나 업데이트가 필요한 경우, Adapter는 데이터 소스로부터 변경된 데이터를 가져와 갱신합니다. 이후 RecyclerView에게 데이터 변경을 알리고, 다시 아이템을 로드하고 화면을 갱신합니다.

Adapter 및 Viewholder 구현

class NotificationRecyclerViewAdapter(var notifications: List<NotificationData>?) :
    RecyclerView.Adapter<NotificationRecyclerViewAdapter.ViewHolder>() {

    inner class ViewHolder(
        val binding: RecyclerItemNotificationBinding
    ) : RecyclerView.ViewHolder(binding.root) {

        fun bind(eachNotification: NotificationData) {
            binding.notificationData = eachNotification
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            RecyclerItemNotificationBinding.inflate(
                LayoutInflater.from(parent.context), parent, false
            )
        )
    }

    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        notifications?.get(position)?.let { holder.bind(it) }
    }

    override fun getItemCount(): Int {
        return notifications?.size?: 0
    }
}

OnCreateViewHolder

  • onCreateViewHolder는 RecyclerView에 보여지는 아이템의 뷰를 생성하는 역할을 합니다.
  • parent와 viewType 매개변수를 받아서 새로운 ViewHolder 객체를 생성하고 반환합니다.

OnBindViewHolder

  • ViewHolder에 데이터를 바인딩하여 아이템을 초기화합니다.
  • holder와 position 매개변수를 받아 해당 위치의 아이템에 대한 데이터를 ViewHolder에 바인딩합니다.

getItemCount

  • getItemCount는 RecyclerView에 표시할 아이템의 총 개수를 반환합니다.

RecyclerView 어댑터 및 레이아웃매니저 지정

class NotificationFragment :
    BindingFragment<FragmentNotificationBinding>(R.layout.fragment_notification) {
		.
        .
    private var adapter = NotificationRecyclerViewAdapter(notifications)


    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)
		.
        .
        initRecyclerView()
    }

    private fun initRecyclerView() {

        binding.notificationRecycler.layoutManager =
            LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
        binding.notificationRecycler.adapter = adapter
    }
    .
    .
    .
}

https://developer.android.com/guide/topics/ui/layout/recyclerview?hl=ko

profile
화이팅

0개의 댓글