전공수업/Kotlin

[Kotlin] 모바일프로그래밍 7주차

aaahyunseo 2024. 10. 12. 03:54

리사이클러뷰(ResyclerView)

: 스피너처럼 목록을 화면에 출력.

→스피너 확장판

[ 데이터 - 어댑터 - 스피너 / 리사이클러뷰 ]

스피너는 스피터 어댑터를 사용해서 데이터 연결.

리사이클러뷰는 리사이클러 어댑터를 사용해서 데이터 연결.

 

//Memo.kt
package com.example.containerrecyclerview

data class Memo(var no: Int, var title: String, var timestamp: Long)

 

//CustomAdapter.kt
//Holder 파일
package com.example.containerrecyclerview

import android.view.LayoutInflater
import android.view.ViewGroup
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView
import com.example.containerrecyclerview.databinding.ItemRecyclerBinding
import java.text.SimpleDateFormat

class CustomAdater: RecyclerView.Adapter<Holder>() {
    //추상화 클래스(오버라이드 해줘야 함), 제네릭이라 타입 지정해줘야 함.

    var listData = mutableListOf<Memo>()

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
        //item_recycler 화면을 onCreate
        val binding = ItemRecyclerBinding.inflate(LayoutInflater.from(parent.context),parent, false)
        return Holder(binding)
    }

    override fun onBindViewHolder(holder: Holder, position: Int) {
        //실제 화면에 보여주는 것.
        val memo = listData.get(position)
        holder.setMemo(memo)
    }

    override fun getItemCount(): Int {
        //메모 데이터 갯수.
        return listData.size
    }
}
class Holder(val binding: ItemRecyclerBinding): RecyclerView.ViewHolder(binding.root){
    //ViewHolder 상속 , binding에 item_recycler.xml 화면 전달.
    //이 클래스를 먼저 만들고 위에 추상클래스 제네릭 타입을 Holder로 지정해줘 함.->이거 "먼저" 만드는 것 아주아주 중요!!!

    init{
        binding.root.setOnClickListener {
            Toast.makeText(binding.root.context,"클릭된 아이템 = ${binding.textTitle.text}", Toast.LENGTH_LONG).show()
        }
    }

    fun setMemo(memo: Memo){
        binding.textNo.text = "${memo.no}"
        binding.textTitle.text = memo.title
        var sdf = SimpleDateFormat("yyyy/MM/dd")
        //date 데이터 크기 자체가 너무 커서 현재 시간으로 반환해주는 함수 사용
        var formattedDate = sdf.format(memo.timestamp)
        binding.textDate.text = formattedDate
    }
}

 

//MainActivicy.kt
package com.example.containerrecyclerview

import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import androidx.recyclerview.widget.LinearLayoutManager
import com.example.containerrecyclerview.databinding.ActivityMainBinding

class MainActivity : AppCompatActivity() {

    val binding by lazy{
        ActivityMainBinding.inflate(layoutInflater)
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(binding.root)

        val data: MutableList<Memo> = loadData()
        var adapter = CustomAdater()
        adapter.listData = data

        binding.recyclerView.adapter = adapter
        binding.recyclerView.layoutManager = LinearLayoutManager(this)
    }

    fun loadData(): MutableList<Memo>{
        val data: MutableList<Memo> = mutableListOf()

        for(no in 1..100){
            val title = "이것이 안드로이드다 ${no}"
            val date = System.currentTimeMillis()
            var memo = Memo(no, title, date)
            data.add(memo)
        }
        return data
    }
}