Kotlinベース#8 RecycleViewとAdapter


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は後で話します.