728x90
반응형
⭐ RecyclerView란?
- View를 재활용하는 기능을 추가한 효과적인 ListView이다.
ViewHolder란?
- 각 뷰를 보관하는 Holder 객체이다.
- → ListView 와 RecyclerView는 inflate를 최소화 하기 위해 뷰를 재활용한다. 이 때 각 뷰의 내용을 업데이트하기 위해서는 findViewById를 매번 호출해야하고, 이로 인한 성능저하 때문에 ItemView의 각 요소를 바로 엑세스 할 수 있도록 저장해두고 사용하기 위한 객체를 만든다. 그리고 이것이 ViewHolder 이다.
- inflate : xml로 쓰여있는 View의 정의를 실제 View 객체로 만드는 것을 의미한다.
특징
//ViewHolder 만들어질 때 실행할 동작
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MemoViewHolder {
val binding = ItemMemoBinding.inflate(LayoutInflater.from(parent.context),parent,false)
return MemoViewHolder(binding)
}
// MemoViewHolder는 ViewHolder를 따로 정의 한 것이다.
- View를 미리 담아놓고 재활용하는 ViewHolder를 사용한다.
- Layout의 XML 정보를 미리 해석 (Inflate)해두어 재활용한다.
- 표현방법을 정하는 LayoutManager를 사용한다.
- 선형 배치 : LinearLayoutManager
- 그리드 배치 : GridLayoutManager
- etc . . .
RecyclerView Adapter의 구성요소
- 실제 item을 담고있는 List
- ViewHolder 객체
ViewHolder 생성 시에 수행할 작업을 작성한 함수
- onCreateViewHolder
- ViewHolder 객체를 만들어 리턴한다
- ViewHolder 객체는 inner class를 통해서 만들 수 있다.
inner class MemoViewHolder (val binding: ItemMemoBinding) : RecyclerView.ViewHolder(binding.root) {
fun bind(data: Memo)
{
// 중략
}
}
VeiwHolder가 보일 때 수행할 작업 (데이터를 꺼내 각 View 설정)
- onBindViewHolder
- inner class로 ViewHolder 객체를 만들었다면 객체 안에 수행 할 작업 함수인 bind 함수를 호출한다.
// 예시
override fun onBindViewHolder(holder: MemoViewHolder, position: Int) {
holder.bind(dataList[position])
}
- item click에 관련된 함수도 작성할 수 있다.
//예시
override fun onBindViewHolder(holder:MemoViewHolder, position:Int)
holder.itemView.setOnClickListener {
itemClickListener.onClick(it,position)
}
}
- RecyclerView에서 표현해야 할 총 아이템 수
- getItemCount()
- 첫 선언 : 인수로 dataList를 받고, RecyclerView.Adapte<RVAdapter 이름. ViewHolder>를 상속받는다.
//예시
class MemoRVAdapter(private val dataList:ArrayList<Memo>) : RecyclerView.Adapter<MemoRVAdapter.MemoViewHolder>()
RecylcerView 나타내기 - XML 파일
- 리스트를 만들 화면 XML파일에 <RecyclerView></RecyclerView> 를 통해 RecyclerView를 생성 한다.
- RecyclerView 에 나타날 item xml 파일도 만들어준다.
- 각 XML 파일 코드는 생략하겠다.
- xml 파일에서 RecyclerView 의 id는 rv_memo이다.
RecylcerView 나타내기 - Activity Class
private val dataList: ArrayList<Memo> = arrayListOf()
//중략
val dataRVAdapter = MemoRVAdapter(dataList) //로 data의 array를 RVAdapter에 전달.
//중략
binding.rvMemo.layoutManager = LinearLayoutManager(this@MemoListActivity)
binding.rvMemo.adapter = dataRVAdapter
- 다음과 같이 layoutManager를 반드시 설정해주어야 한다! 하지않으면 화면에 RecyclerView가 뜨지않는다.. ㅠ.ㅠ 나는 수직 아래로 내려오는 RecyclerView를 만들기 위해 LinearLayoutManager를 설정하였다. 이부분은 만들고자 하는 Recyclerview의 모양에 따라 지정해주면 된다.
여담
RecyclerView Adapter를 만들때 항상 override 해야하는 각 함수들이 무엇을 의미하는지 헷갈렸는데 이번 포스팅을 통해서 각 함수가 어떤걸 의미하고, 내가 RecyclerView Item에 데이터를 표시할때 어떤식으로 ViewHolder를 만들어야 하는지 제대로 알게되었다! 이렇게 정리해봐야지 머리에 남는 느낌 . . .
728x90
반응형
'Android > 공부' 카테고리의 다른 글
[Android] Retrofit2 싱글톤패턴 적용하기 (0) | 2022.11.26 |
---|---|
[Android] Recyclerview item Click / Click Listener 등록하는 법 (0) | 2022.11.01 |
[Android] RecyclerView 데이터 추가/삭제/수정 반영 방법 (0) | 2022.10.26 |
[Android] 안드로이드 기본 dialog 생성하기 (0) | 2022.10.25 |
[Android] Activity와 Fragment 생명주기 (1) | 2022.10.25 |