안드로이드 앱에서 리스트로 보여주는 것은 많은 비율을 차지한다.
아이템을 리스트 업할때 매번 레코드를 생성하는 것이 아니라 메모리 절약을 위해 재활용 하는
방법을 보여준다.
리스트 업할 데이터를 생성하고
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>
'Andorid Kotlin' 카테고리의 다른 글
GLSurfaceView 배경 투명으로 하는 법 (1) | 2024.10.05 |
---|---|
액티비티간 데이터 주고 받기 (0) | 2024.10.02 |
common 위젯 사용 (seekBar, toggle, progress bar, spiner (0) | 2024.10.02 |
체크박스 리스너 등록 (1) | 2024.10.02 |
layout에 생성한 오브젝트 접근 방법 (0) | 2024.10.01 |