RecyclerView 복습
어댑터와 Activity 간의 데이터 이동 흐름 이해하기
* 리사이클러뷰에서 활용할 item(item_recylcerview.xml)
<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="wrap_content">
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="409dp"
android:layout_height="150dp"
app:layout_constraintHorizontal_bias="0.0"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintTop_toTopOf="parent">
<ImageView
android:id="@+id/iconItem"
android:layout_width="137dp"
android:layout_height="107dp"
android:layout_marginStart="15dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent"
tools:src="@drawable/image1" />
<androidx.constraintlayout.widget.ConstraintLayout
android:layout_width="206dp"
android:layout_height="97dp"
android:layout_marginStart="25dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintStart_toEndOf="@+id/iconItem"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/textItem2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:textSize="20dp"
android:hint="Age"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toBottomOf="@+id/textItem1" />
<TextView
android:id="@+id/textItem1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="15dp"
android:textSize="20dp"
android:hint="Name"
app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
</androidx.constraintlayout.widget.ConstraintLayout>
* 메인 화면(MainActivity)
import android.os.Bundle
import android.view.View
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.LinearLayoutManager
import com.android.recycleview.databinding.ActivityMainBinding
class MainActivity : AppCompatActivity() {
private lateinit var binding : ActivityMainBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivityMainBinding.inflate(layoutInflater)
setContentView(binding.root)
//데이터 원본 가져오기(List 형식의 MyItem형)
val dataList = mutableListOf<MyItem>()
dataList.add(MyItem(R.drawable.image1,"DD","1"))
dataList.add(MyItem(R.drawable.image2,"AA","2"))
dataList.add(MyItem(R.drawable.image3,"BB","3"))
dataList.add(MyItem(R.drawable.image4,"CC","4"))
dataList.add(MyItem(R.drawable.image5,"TT","5"))
//val adapter는 dataList 값을 넣은 MyAdapter로 초기화 함
val adapter = MyAdapter(dataList)
// recyclerView의 adapter는 위의 변수 adapter로 초기화 함
binding.recyclerView.adapter = adapter
binding.recyclerView.layoutManager = LinearLayoutManager(this)
adapter.itemClick = object : MyAdapter.ItemClick {
override fun onClick(view: View, position: Int) {
//클릭 시 해당 dataList의 position(= 인덱스, 위치)의 이름이 출력 됨
val name : String = dataList[position].aName
Toast.makeText(this@MainActivity,"$name 선택", Toast.LENGTH_SHORT).show()
}
}
}
}
val dataList = mutableListOf<MyItem>() | 데이터 원본 가져오기(List 형식의 MyItem형) |
val adapter = MyAdapter(dataList) | val adapter는 dataList 값을 넣은 MyAdapter로 초기화 함 |
binding.recyclerView.adapter = adapter | recyclerView의 adapter를 val adapter로 초기화 함 |
adapter.itemClick = object : MyAdapter.ItemClick { override fun onClick(view: View, position: Int) { val name : String = dataList[position].aName Toast.makeText(this@MainActivity,"$name 선택", Toast.LENGTH_SHORT).show() } } |
클릭 시 해당 dataList의 position(= 인덱스, 위치)의 이름이 출력 됨 |
* 메인 화면의 실제 레이아웃 구성(activity_main.xml)
<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:id="@+id/main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</androidx.constraintlayout.widget.ConstraintLayout>
* Adapter(MyAdapter)
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.android.recycleview.databinding.ItemRecyclerviewBinding
class MyAdapter(val mItems : MutableList<MyItem>) : RecyclerView.Adapter<MyAdapter.Holder>(){
interface ItemClick{
fun onClick(view: View,position : Int)
}
var itemClick : ItemClick? = null
//ViewHolder 객체를 생성하는 곳
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
val binding = ItemRecyclerviewBinding.inflate(LayoutInflater.from(parent.context), parent, false)
//Holder를 val binding으로 초기화하여 반환
return Holder(binding)
}
//이 함수에 작성된 위치로 바인딩 함
override fun onBindViewHolder(holder: Holder, position: Int) {
holder.itemView.setOnClickListener {
itemClick?.onClick(it, position)
}
//mItems의 position. 즉, data 클래스인 MyItem에 저장된 dataList ImageResource와 Name, Age 값으로 초기화 함
holder.iconImageView.setImageResource(mItems[position].aIcon)
holder.name.text = mItems[position].aName
holder.age.text = mItems[position].aAge
}
//id를 item의 position(인덱스)을 toLong형으로 반환
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getItemCount(): Int {
//mItems의 size만큼 item 표시? 반복?
return mItems.size
}
//여기가 ViewHolder 객체, 따로 작성해둔 아이템(item_recyclerview)의 내용을 담음
inner class Holder(val binding: ItemRecyclerviewBinding) : RecyclerView.ViewHolder(binding.root){
//변수들은 아이템의 imageView와 textView로 초기화 함
val iconImageView = binding.iconItem
val name = binding.textItem1
val age = binding.textItem2
}
}
onCreateViewHolder() | ViewHolder 객체를 생성하는 곳, val binding으로 초기화 한 Holder를 반환 |
onBindViewHolder() |
이 함수에 작성된 위치로 바인딩 함 |
holder.iconImageView.setImageResource(mItems[position].aIcon) holder.name.text = mItems[position].aName holder.age.text = mItems[position].aAge |
mItems의 position. 즉, data 클래스인 MyItem에 저장된 dataList ImageResource와 Name, Age 값으로 초기화 함 |
getItemId() | id를 item의 position(인덱스)을 toLong형으로 반환 |
getItemCount() | mItems의 size만큼 item 표시 |
inner class Holder() | ViewHolder 객체, 따로 작성해둔 아이템(item_recyclerview)의 내용을 담음 |
* Data Class(MyItem)
data class MyItem(val aIcon : Int, val aName : String, val aAge : String) { }
'Android 앱개발 공부 > TIL(Today I Learned)' 카테고리의 다른 글
[Android] TIL 44일차 (0) | 2024.08.02 |
---|---|
[Android] TIL 43일차 (0) | 2024.07.31 |
[Android] TIL 41일차 (1) | 2024.07.23 |
[Android] TIL 40일차 (3) | 2024.07.22 |
[Android] TIL 38일차 (1) | 2024.07.18 |