Kotlin 기초#8 RecycleView와 Adapter

0

야! 너두 코틀린

목록 보기
8/13

1. Recycle View

리사이클 뷰에 대해 얘기해보겠다.

일단 RecycleView에 넣을 item-Layout을 생성하자.
RecycleView는 item-Layout의 리스트다.


//일단 넣을 배열을 생성한다. 여기선 단순하게 만들었지만 
    fun loadData(): MutableList<Memo> {
        val memoList = mutableListOf<Memo>()
        for (no in 1..100) {
            val title = "이것이 안드로이드? $no"
            val date = System.currentTimeMillis()
            val memo = Memo(no, title, date)
            memoList.add(memo)

        }
        return memoList
    }

이제 틀을 넣어보자.

        //1. 데이터를 불러온다.
        val data = loadData()
        //2. 아다터를 생성
        val customAdapter = CustomAdapter(data)
        //3. 화면의 RecyclerView와 연결
        binding.recyclerView.adapter = customAdapter
        //4. 레이아웃 매니저 설정
        binding.recyclerView.layoutManager = LinearLayoutManager(this)

Adapter가 세팅되면 메인의 할일은 끝난다.

2. Adapter

어뎁터는 내부클래스로도 선언할 수 있고, 외부에 빼서 모듈화 시킬수 있다.
뭐가 옳은지는 모르겠지만, 유지보수면에서는 모듈화가 훨씬 편하지 않을까?

class CustomAdapter(val listData: MutableList<Memo>) :
    RecyclerView.Adapter<CustomAdapter.Holder>() {
	
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        val binding = ItemRecycleBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return Holder(binding)
    }

    override fun getItemCount() = listData.size


    override fun onBindViewHolder(holder: Holder, position: Int) {
        // 1. 사용할 데이터를 꺼낸다.
        val memo = listData.get(position)
        // 2. 폴더에 데이터를 전달한다.
        holder.setMemo(memo)

    }
    
    //1. 홀더를 먼저 생성한다.
    class Holder(val binding: ItemRecycleBinding) : RecyclerView.ViewHolder(binding.root) {
        lateinit var currentMemo: Memo

        // 클릭처리는 init에서만 한다.
        init {
            binding.root.setOnClickListener {
                val title = binding.TextTitle.text
                Toast.makeText(
                    binding.root.context,
                    "클릭된 아이템 : ${currentMemo.title}",
                    Toast.LENGTH_LONG
                ).show()
            }
        }


        //3. 받은 데이터를 화면에 출력한다.
        fun setMemo(memo: Memo) {
            currentMemo = memo

            with(binding) {
                TextNo.text = "${memo.no}"
                TextTitle.text = "${memo.title}"

                val sdf = SimpleDateFormat("yyyy-MM-dd")
                val formattedDate = sdf.format(memo.timestamp)
                TextDate.text = "${formattedDate}"
            }
        }
    }

차근차근 보자면..

    //1. 홀더를 먼저 생성한다.
    class Holder(val binding: ItemRecycleBinding) : RecyclerView.ViewHolder(binding.root) {
    	//Recycle이기 때문에 bind로 호출하면 값이 꼬일수도 있다.
        lateinit var currentMemo: Memo

        // 클릭처리는 init에서만 한다.
        init {
            binding.root.setOnClickListener {
                val title = binding.TextTitle.text
                Toast.makeText(
                    binding.root.context,
                    "클릭된 아이템 : ${currentMemo.title}",
                    Toast.LENGTH_LONG
                ).show()
        }
        
        //Memo를 세팅해주는 역할이다. 값을 매핑해준다.
        fun setMemo(memo: Memo) {
            currentMemo = memo

            with(binding) {
                TextNo.text = "${memo.no}"
                TextTitle.text = "${memo.title}"

                val sdf = SimpleDateFormat("yyyy-MM-dd")
                val formattedDate = sdf.format(memo.timestamp)
                TextDate.text = "${formattedDate}"
            }
        }  
        

그후에 Override를 채운다.

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
    	// 일반적으로 이렇게 쓰인다. 모듈화때만 ViewType을 통해 변경되는것이 있다.
        val binding = ItemRecycleBinding.inflate(LayoutInflater.from(parent.context), parent, false)
        return Holder(binding)
    }

    override fun getItemCount() = listData.size


    override fun onBindViewHolder(holder: Holder, position: Int) {
        // 1. 사용할 데이터를 꺼낸다.
        val memo = listData.get(position)
        // 2. 홀더에 데이터를 전달한다.
        holder.setMemo(memo)

    }
    

모듈화한 Adapter는 후에 다루도록 하겠다.

profile
쉽게 가르칠수 있도록 노력하자

0개의 댓글