ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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 메서드는 리스트의 길이 만큼 반복적으로 호출 됨

     

    *코드 동작 원리는 아래 블로그 게시글을 참고하였습니다*

    https://nanamare.tistory.com/entry/Recycler-view-%EB%8F%99%EC%9E%91-%EC%9B%90%EB%A6%AC?category=752763

     

    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

    댓글

Designed by Tistory.