-
[Android] 간단한 RecyclerView안드로이드 2024. 4. 11. 16:48
✏️ TIL(Today I Learned)
RecyclerView를 사용하는 방법을 이해하기 위해 간단한 앱을 만들었다.
activity_main.xml에는 RecyclerView하나만을 넣었다.<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent"> <androidx.recyclerview.widget.RecyclerView android:id="@+id/recyclerView" android:layout_width="match_parent" android:layout_height="match_parent" /> </LinearLayout>
그리고 RecyclerView의 아이템을 나타낼 item_recyclerview.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="wrap_content" android:orientation="horizontal"> <ImageView android:id="@+id/imageItem" android:layout_width="80dp" android:layout_height="100dp" android:layout_gravity="center" android:layout_weight="1" android:padding="4dp" android:scaleType="centerCrop" android:src="@drawable/cat_1" /> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="match_parent" android:layout_weight="3"> <TextView android:id="@+id/textItem1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="20dp" android:padding="4dp" android:hint="Name" /> <TextView android:id="@+id/textItem2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="16dp" android:padding="4dp" android:hint="Age" /> </LinearLayout> </LinearLayout>
그다음, RecyclerView에 표시될 각 항목의 뷰를 생성하고 관리할 Adapter를 만들어줬다.
onBindViewHolder() 메소드를 사용하여 데이터를 해당 뷰에 바인딩했다.
class MyAdapter(val myItems: MutableList<MyItem>) : RecyclerView.Adapter<MyAdapter.Holder>() { interface ItemClick { fun onClick(view : View, position : Int) } var itemClick : ItemClick? = null override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder { val binding = ItemRecyclerviewBinding.inflate(LayoutInflater.from(parent.context), parent, false) return Holder(binding) } override fun onBindViewHolder(holder: Holder, position: Int) { holder.itemView.setOnClickListener { itemClick?.onClick(it, position) } holder.imageView.setImageResource(myItems[position].aImage) holder.name.text = myItems[position].aName holder.age.text = myItems[position].aAge } override fun getItemId(position: Int): Long { return position.toLong() } override fun getItemCount(): Int { return myItems.size } inner class Holder(val binding: ItemRecyclerviewBinding) : RecyclerView.ViewHolder(binding.root) { val imageView = binding.imageItem val name = binding.textItem1 val age = binding.textItem2 } }
MainActivity에서는 샘플 데이터를 넣어주고, MyAdapter의 ItemClick 인터페이스를 구현했다.
RecyclerView의 아이템이 클릭되면, 해당 아이템의 이름을 토스트로 나타나게 했다.
class MainActivity : AppCompatActivity() { private lateinit var binding: ActivityMainBinding override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) binding = ActivityMainBinding.inflate(layoutInflater) setContentView(binding.root) val dataList = mutableListOf<MyItem>() dataList.add(MyItem(R.drawable.cat_1, "Bella", "1")) dataList.add(MyItem(R.drawable.cat_2, "Charlie", "2")) dataList.add(MyItem(R.drawable.cat_3, "Daisy", "1.5")) dataList.add(MyItem(R.drawable.cat_4, "Duke", "1")) dataList.add(MyItem(R.drawable.cat_5, "Max", "2")) dataList.add(MyItem(R.drawable.cat_6, "Happy", "4")) dataList.add(MyItem(R.drawable.cat_7, "Luna", "3")) dataList.add(MyItem(R.drawable.cat_8, "Bob", "2")) dataList.add(MyItem(R.drawable.cat_9, "Bob", "2")) dataList.add(MyItem(R.drawable.cat_10, "Bob", "2")) binding.recyclerView.adapter = MyAdapter(dataList) val adapter = MyAdapter(dataList) binding.recyclerView.adapter = adapter binding.recyclerView.layoutManager = LinearLayoutManager(this) 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() } } } }
// MyItem.kt data class MyItem(val aImage:Int, val aName:String, val aAge:String)
📝 공부한 Kotlin 정리RecyclerView
RecyclerView는 안드로이드 앱에서 리스트 형태의 데이터를 표시하는 데 사용되는 위젯이다. 여러 아이템을 스크롤 가능한 리스트로 표현하며, 많은 아이템을 효율적으로 관리하고 보여주는 역할을 한다.
- 한정적인 화면에 많은 데이터를 넣을 수 있는 View이다.
- 사용자가 스크롤 할 때, 위에 있던 아이템은 아래로 이동하여 재활용된다.
- 예) 아이템이 100개이면 10개 정도의 View만 만들고, 10개를 재활용해서 사용한다.
- View를 계속 만드는 ListView의 단점을 보완하기 위해 만들어졌다.
(사용자가 스크롤 할 때마다, 위에 있던 아이템은 삭제되고, 맨 아래의 아이템은 생성되길 반복)
Adapter
RecyclerView에서 Adapter는 데이터와 뷰 간의 중개자 역할을 한다. 데이터 테이블을 목록 형태로 보여주기 위해 사용되는 것으로, 데이터를 다양한 형식의 리스트 형식을 보여주기 위해서 데이터와 RecyclerView 사이에 존재하는 객체이다.
- 데이터 바인딩:
Adapter는 데이터를 뷰에 바인딩하여 화면에 표시되도록 한다. 리스트나 그리드와 같은 형태로 표시할 데이터를 RecyclerView에 제공한다. - 뷰 생성 및 관리:
RecyclerView에 표시될 각 항목의 뷰를 생성하고 관리합니다. onCreateViewHolder() 메소드를 사용하여 새로운 뷰를 생성하고, onBindViewHolder() 메소드를 사용하여 데이터를 해당 뷰에 바인딩한다. - 데이터 변경 감지:
데이터가 변경되면, Adapter는 이를 감지하고 RecyclerView에 알려 업데이트가 필요한 부분을 다시 그린다. notifyDataSetChanged()나 notifyItemInserted()와 같은 메소드를 사용하여 데이터 변경을 RecyclerView에 알린다. - 아이템 클릭 리스너:
RecyclerView의 아이템 클릭 이벤트를 처리할 수 있는 리스너를 제공한다. 이를 통해 사용자의 상호작용에 따라 적절한 동작을 수행할 수 있다.
ViewHolder
ViewHolder란 화면에 표시될 데이터의 각 항목에 대한 View를 저장하는 역할을 한다. RecyclerView에서 스크롤 해서 위로 올라간 View를 재활용하기 위해서는 해당 View를 기억해야 한다. ViewHolder는 이 역할을 하는 것이다.
일반적으로 RecyclerView의 Adapter에서 ViewHolder 클래스를 정의하고, onCreateViewHolder()에서 새로운 뷰를 생성할 때 이 ViewHolder를 사용한다. 이러면 RecyclerView가 뷰를 스크롤하거나 데이터를 업데이트할 때마다 새로운 뷰를 생성하는 것이 아니라 뷰를 재활용하기 때문에 성능이 향상된다.
'안드로이드' 카테고리의 다른 글
[Android] [당근마켓 클론 코딩] 메인페이지 구현1 (RecyclerView/ addItemDecoration()/ Spinner/ ArrayAdapter) (0) 2024.04.16 [Android] Fragment 데이터 전달 (0) 2024.04.11 [Android] MVVM 패턴 회원가입 유효성 검사 (0) 2024.04.09 [Android] 인스타그램 클론 코딩 팀 프로젝트 KPT 회고록 (0) 2024.04.08 [Android] [인스타그램 클론 코딩] 갤러리 접근 허용 & 사진 이미지 뷰에 등록 (registerForActivityResult() 사용) (1) 2024.04.03