리사이클러뷰

Seongho·2021년 10월 30일

앱 개발

목록 보기
3/4

https://jinsangjin.tistory.com/24?category=800560

1. ViewHolder

  • 개별 아이템의 View를 생성하여 제공한다.

2. Adapter

  • 데이터를 관리하고 목록에 표시한다.
  • Adapter 클래스는 다음 세 가지 함수를 가져야 한다.
    • onCreateViewHolder
    • onBindViewHolder
    • getItemCount
      • 몇 개나 화면에 표시할지..

3. Activity

  • recycler View를 보여준다.

4. ViewHolder와 Adapter 예시

예시1(https://jinsangjin.tistory.com/24?category=800560)

class MyAdapter(private val myDataset: Array<String>) :
        RecyclerView.Adapter<MyAdapter.MyViewHolder>() {

    //개별 아이템에 view 생성하여 제공
    class MyViewHolder(val textView: TextView) : RecyclerView.ViewHolder(textView)

    //실제로 표현될 item view 생성
    override fun onCreateViewHolder(parent: ViewGroup,
                                    viewType: Int): MyAdapter.MyViewHolder {
        // 내가 표현하고 싶은(코드로 조작하고 싶은) 레이아웃을 inflate하고
        val textView = LayoutInflater.from(parent.context)
                .inflate(R.layout.my_text_view, parent, false) as TextView
    
    	//ViewHolder에 담아서 반환한다.
        return MyViewHolder(textView)
    }

    //item에 데이터를 바인딩한다. 화면에 들어온 아이템에 대해서만 작업을 진행
    override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
        // - get element from your dataset at this position
        // - replace the contents of the view with that element
        holder.textView.text = myDataset[position]
    }

    // item의 갯수를 반환한다.
    override fun getItemCount() = myDataset.size
}

예시2(https://www.youtube.com/watch?v=nzlzY4WrsAQ&t=1s)

class PersonAdapter(val items: List<Person>,
                    private val clickListener: (person: Person) -> Unit) :
    RecyclerView.Adapter<PersonAdapter.PersonViewHolder>() {
    class PersonViewHolder(val binding: ItemPersonBinding): RecyclerView.ViewHolder(binding.root)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): PersonViewHolder {
        // 리사이클러뷰에 사용할 아이템 각각
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_person, parent, false)
		// 어댑터에 뷰를 제공하기 위해 틀에 집어넣는 느낌?
        val viewHolder = PersonViewHolder(ItemPersonBinding.bind(view))

        view.setOnClickListener {clickListener.invoke(items[viewHolder.adapterPosition])}

        return viewHolder
    }

    override fun onBindViewHolder(holder: PersonViewHolder, position: Int) {
        // xml에서 데이터 바인딩중인데, 거기에 값을 넣어줌(현재 화면에 보이는 값만)
        holder.binding.person = items[position]
    }

    override fun getItemCount(): Int {
        return items.size
    }
}

0개의 댓글