-
[Android/Kotlin] 리사이클러뷰(RecyclerView)Android/Kotlin 2022. 7. 7. 14:36반응형
[모든 포스팅은 개인적 공부를 위해 작성된 글입니다]
<장점>
- ListView의 개선판(ViewHolder 개념 포함)
- 유연함
- ListView는 수직으로만 스크롤이 가능하지만 RecyclerView는 LayoutManager를 통해 Linear, Glide(바둑판), StaggeredGrid(형태가 일정하지 않은 바둑판) 형태로 구현 가능
<RecylcerView 생성하기>
val recyclerView: RecyclerView = findViewById(R.id.recyclerView) val adapter = RecylcerViewAdapter(carList, LayoutInflater.from(this@RecylcerVIew)) recyclerView.adapter = adapter recyclerView.layoutManager = LinearLayoutManager(this@RecylcerVIew)
class RecylcerViewAdapter(val itemList: ArrayList<Car>, val inflater: LayoutInflater): RecyclerView.Adapter<RecylcerViewAdapter.ViewHolder>(){ class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){ val carName: TextView val carEngine: TextView init{ carName = itemView.findViewById(R.id.car_name) carEngine = itemView.findViewById(R.id.car_engine) }//ViewHolder 생성되자마자 가장 빠르게 실행되는 부분(init == 초기화 블럭) } override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder { val view = inflater.inflate(R.layout.addview, parent, false) return ViewHolder(view) }//뷰 만들어줌 override fun onBindViewHolder(holder: ViewHolder, position: Int) { holder.carName.setText(itemList.get(position).name) holder.carEngine.setText(itemList.get(position).engine) }//홀더 내부 그려줌 override fun getItemCount(): Int { return itemList.size } }
<RecyclerView ViewHolder 동작 원리>
- 메서드 호출 순서- 1. getIemCount() : item 총 개수 판단(getItemViewType 메서드 사용해 원하는 viewType 지정해 줄 수도 있음)
- 2. onCreateViewHolder()에서 (viewType에 해당하는) ViewHolder 생성(return ViewHolder(view))(ViewHolder 내부에 있는 코드 실행)
- 3. onBindViewHolder() 호출되어 position에 맞는 데이터를 ViewHolder 내부 View에 바인딩
- getItemCount()는 아이템 리스트의 길이에 상관 없이 초기에 한 번만 호출되지만 getItemViewType, onCreateViewHolder, onBindViewHolder 메서드는 리스트의 길이 만큼 반복적으로 호출 됨
*코드 동작 원리는 아래 블로그 게시글을 참고하였습니다*
Recycler view 동작 원리
Recycler view 동작 원리 Recycler view 의 아답터에 데이터가 300개 있고 화면에 10개의 데이터가 보여진다면, 10개의 데이터 공간을 생성하고, 그 10개의 공간을 재활용해서 300개의 데이터를 보여준다 호
nanamare.tistory.com
<RecylcerView 클릭 리스너>
class RecylcerViewAdapter(val itemList: ArrayList<Car>, val inflater: LayoutInflater): RecyclerView.Adapter<RecylcerViewAdapter.ViewHolder>(){ inner class ViewHolder(itemView: View): RecyclerView.ViewHolder(itemView){ val carName: TextView val carEngine: TextView init{ carName = itemView.findViewById(R.id.car_name) carEngine = itemView.findViewById(R.id.car_engine) itemView.setOnClickListener{ val position: Int = adapterPosition val engineName = itemList.get(position).engine Log.d("engine",engineName) } }//ViewHolder 생성되자마자 가장 빠르게 실행되는 부분(init == 초기화 블럭) }
- init 안에 setOnClickListener 사용
- ViewHolder 클래스 앞에 inner 붙이는 이유
- ViewHolder는 내부 클래스(inner class)이므로 외부 클래스(RecyclerViewAdapter)에 접근 불가
- inner 키워드 사용해 접근할 수 있도록 함
- adapterPosition 변수 : 현재 position 반환
반응형'Android > Kotlin' 카테고리의 다른 글
[Android/Kotlin] Sharedpreference (0) 2022.07.08 [Android/Kotlin] TabLayout, pager (0) 2022.07.08 [Android/Kotlin] 리스트뷰(ListView) (0) 2022.07.06 [Android/Kotlin] AddView (0) 2022.07.05 [Android/Kotlin] 스레드(Thread) (0) 2022.07.03