본문 바로가기
Andorid Kotlin

리사이클 레코드 보여주기

by SimonLee 2024. 10. 2.

안드로이드 앱에서 리스트로 보여주는 것은 많은 비율을 차지한다.

아이템을 리스트 업할때 매번 레코드를 생성하는 것이 아니라 메모리 절약을 위해 재활용 하는

방법을 보여준다.

 

리스트 업할 데이터를 생성하고

Custom Adapter를 정의한다.

Custom Adapter는 RecyclerView.Adapter를 상속 받아야 한다.

RecyclerView.Adapter는 제네릭 클래스 이기 때문에 RecyclerView.ViewHolder( .. )를 상속받은 클래스를 상속받아야 함.

 

RecyclerView.ViewHolder( .. )를 상속받은 Holder 클래스를 생성하자.

RecyclerView.ViewHolder( .. ) 상속할때 binding을 넘겨 주어야 한다.

이 바인딩은 한 레코드의 대한 바인딩이다.

val binding = ItemRecyclerBinding.inflate(LayoutInflater.from(parent.context), parent, false)

 

 

class MainActivity : AppCompatActivity() {
    val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
    val TAG = "MainActivity"

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

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

    fun loadData() : MutableList<Memo> {
        val memoList = mutableListOf<Memo>()
        for (no in 1 .. 100) {
            val title = "android is $no"
            val date = System.currentTimeMillis()
            val memo = Memo(no, title, date)
            memoList.add(memo)
        }
        return memoList
    }
}

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

    override fun getItemCount(): Int = listData.size

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

    class Holder(val binding:ItemRecyclerBinding) : 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_SHORT).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

            }
        }

    }
}

 

Manifest

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#FFFFFF"
    tools:context=".MainActivity">

    <TextView
        android:id="@+id/textView4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="8dp"
        android:text="RecycleView"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintHorizontal_bias="0.438"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycleView"
        android:layout_width="0dp"
        android:layout_height="0dp"
        android:layout_marginTop="8dp"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@+id/textView4" />

</androidx.constraintlayout.widget.ConstraintLayout>

 

Memo Data Class

package com.example.basiclayout

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

 

 

item_recycler.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:gravity="center|center_vertical"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/textNo"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="01" />

    <TextView
        android:id="@+id/textTitle"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="5"
        android:text="Title" />

    <TextView
        android:id="@+id/textDate"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="3"
        android:text="2021-03-30" />
</LinearLayout>