TIL/숙련til

RecyclerView

crablo 2024. 4. 9. 15:07
728x90

저번에는 ListView나 GridView를 이용해서 사진을 나타내는 작업을 했는데

이번에는 RecyclerView를 사용하는 방법을 공부해보았다.

RecyclerView도 ListView와 마찬가지로 adapter 클래스가 필요하다.

다만 다른점이 있다면

리스트뷰는 스크롤을 했을때 각 아이템들이 삭제되고 생성되기를 반복하여 성능이 떨어진다는 단점이 있지만,

리싸이클러뷰는 스크롤을 했을때, 삭제 및 생성을 반복하지 않고 재활용된다는 점이 있어서 리스트뷰보다는 리싸이클러뷰를 많이 사용한다고 한다.

 

리스트뷰와 같이 리싸이클러뷰도 adapter라는것을 사용한다고 했다.

하지만 리싸이클러뷰는 리스트뷰와 다르게 ViewHolder라는것을 사용해서 뷰에있는 아이템들을 재활용하는 기능을 갖추고 있다.

나는 정확히 이해하기위해 실습을 해보았다.

먼저 내가 좋아 하는 메뉴를 담은 MyItem 이라는 data class를 생성하였다.

 

그 후 각 아이템들을 개별적으로 나타내는 item레이아웃이 rv_item.xml 파일을 생성했다.

그 후 메인 화면에 전체 음식 리스트가 보여져야해서 recyclerview를 넣었다.

그 후 메인에서 데이터 원본을 준비하는 작업을 했다.

그 후 MyAdapter 클래스 생성 후

파라미터로 만든 dataList를 넘겨줬다.

리싸이클러뷰는 RecyclerView.Adapter<MyAdapter.Holder>()를 상속받는데

이 과정에서 inner class로 Holder 을 생성한다.

그 후 onCreateViewHolder()메서드를 재정의 한다.

먼저 parent는 RecyclerView의 부모 ViewGroup이다. 이것은 ViewHolder가 어디에 삽입될지에 대한 정보를 제공한다.

두 번째 파라미터 viewType은 ViewHolder의 유형을 나타낸다. 여러 종류의 ViewHolder를 사용하는 경우에 유용하다.

MyAdapter.Holder형식의 객체를 반환하고, MyAdapter.Holder는 사용자정의 ViewHolder 클래스이다.

val binding = RvItemBinding.inflate(LayoutInflater.from(parent.context),parent,false)

ViewHolder에서 사용할 View를 인플레이트하여 바인딩한다.

RvItemBinding.inflate() 메서드를 사용하여 RvItemBinding 객체를 생성한다.

이 객체는 리싸이클러뷰의 각 항목에 대한 레이아웃의 뷰 바인딩을 나타낸다.

LayoutInflater.from(parent.context) 를 사용하여 LayoutInflater를 생성하고, 이를 통해 부모 컨텍스트(parent.context)에서 인플레이트를 수행한다.

세 번째 파라미터 false는 인플레이트 된 뷰를 부모 ViewGroup에 즉시 첨부하지 않음을 나타낸다.

부모 ViewGroup에 뷰를 첨부하는 것은 onBindViewHolder()메서드에서 수행된다.

return Holder(binding)

위에서 바인딩한 뷰를 사용하여 새로운 ViewHolder 객체를 생성하고 반환한다.

이렇게 생성된 ViewHolder 객체에는 RecyclerView의 각 항목에 대한 뷰들이 바인딩 되어있다.

데이트를 한개한개씩 연결해주는 역할

onBindViewHolder 메서드를 이용해서 데이터를 하나하나씩 연결하는 작업을 한다.

그 후 아이템을 클릭했을때 토스트 메시지를 띄우고 싶어서 어댑터 클래스 내에서 interface를 작성하고

메인액티비티에서 클릭되었을때 토스트 메시지를 띄우는 로직을 작성한다.

 

adapter클래스내에서 인터페이스 작성
메인액티비티에서 아이템 클릭시의 이벤트 처리

728x90

'TIL > 숙련til' 카테고리의 다른 글

프래그먼트 데이터전달 1. Acitivity -> Fragment  (0) 2024.04.14
프래그먼트란?  (0) 2024.04.14
그리드 뷰(GridView)  (0) 2024.04.09
리스트뷰(ListView)  (0) 2024.04.09
어댑터뷰는 무엇인가?  (0) 2024.04.09