Android 앱개발 공부/TIL(Today I Learned)

[Android] TIL 42일차

bunny code 2024. 7. 31. 00:46

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