본문 바로가기

안드로이드/XML

[안드로이드] RecyclerView 리사이클러뷰 개념 및 사용법

우리는 안드로이드 앱을 만들 때 어떠한 목록을 구현해야 될 상황이 생긴다.

 

구현할 데이터 리스트를 받아 화면에 띄워줘야 하는데, 받는 데이터의 개수는 유동적이며, 내용 또한 모두 다르기 때문에 우리가 하나하나 구현해 줄 수는 없다.

 

이를 해결하기 위해 처음에 나온 것이 ListView이며 ListView의 단점을 보완하여 다시 나온 것이 RecyclerView이다.

 

RecyclerView와 ListView의 차이

ListView RecyclerView
스크롤로 인해 없어진 객체(목록)은 삭제되며,
반대로 추가로 보여지는 객체는 생성된다.
스크롤로 인해 없어진 객체는 삭제되지 않고
뒤쪽으로 재배치되어 재사용된다.
생성과 삭제가 반복되기에 비효율적이다. 객체를 재사용하기 때문에 효율적이다.

 

사용법

시작하기에 앞서 기존의 activity와 layout 외에도 2가지를 생성해야 한다.

 

1. Adapter

2. Item Layout

 

RecyclerView는 View인 목록 하나하나가 모여있는 ViewGroup이다.

 

때문에 우리는 목록, 즉 View를 어떻게 보여줄지 알려주는 Item Layout을 만들어줘야 한다.

 

또한 공식문서에서는 다음과 같이 나와있다.

 

"RecyclerView가 뷰를 요청한 다음, 어댑터에서 메서드를 호출하여 뷰를 뷰의 데이터에 바인딩 한다."

 

즉, 어댑터를 이용하여 뷰와 데이터를 묶어 하나의 목록으로 나타내준다고 볼 수 있다.

 

1. activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout 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:orientation="vertical"
    tools:context=".MainActivity">

    <androidx.recyclerview.widget.RecyclerView
        app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

 

xml에서 recyclerview를 세팅하실 때

 

app:layoutManager를 설정 안해주시면 다음과 같은 오류를 마주칠 수 있다.

E/RecyclerView: No layout manager attached; skipping layout

 

2. recyclerview_item.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">

    <TextView
        android:id="@+id/textView"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="30dp"
        android:textColor="#000000"/>
</LinearLayout>

 

목록(view)을 꾸며주는 레이아웃으로, 해당 레이아웃은 취향 것 꾸며주시면 됩니다.

 

3. recycler_Adapter.kt (class)

class recyclerviewAdapter :
    RecyclerView.Adapter<recyclerviewAdapter.ViewHolder>() {
    
    var adapterList = ArrayList<String>()
    
    // 데이터를 목록(view) Layout에 setting
    inner class ViewHolder(view: View): RecyclerView.ViewHolder(view) {
        fun bind(data: String){
            val text : TextView = itemView.findViewById(R.id.textView)
            text.text = data
        }
    }

    fun setRecyclerview(list: ArrayList<String>){
        adapterList = list
        notifyDataSetChanged()
    }
    
    // 목록(view) Layout setting
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return ViewHolder(
            LayoutInflater.from(parent.context)
                .inflate(R.layout.recyclerview_item, parent, false)
        )
    }
    
   //현재 목록의 인덱스(position)에 해당하는 데이터를 ViewHolder에서 처리할 수 있게 보내주는 작업
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        holder.bind(adapterList[position])
    }

   //보여질 데이터 개수
    override fun getItemCount(): Int {
        return adapterList.size
    }
}

 

onBindViewHolder에서도 View에 데이터를 세팅할 수 있으니 상황에 맞춰 사용해주시면 됩니다.

 

notifyDataSetChanged() : 업데이트 또는 삭제, 추가 등 데이터에 어떠한 변화가 생기면 갱신해주는 메서드

 

4. MainActivity.kt (class)

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        
        // 테스트용 데이터
        val list : ArrayList<String> = arrayListOf("one","two","three","four","five","Six")
        
        
        val recyclerview = findViewById<RecyclerView>(R.id.recyclerview)
        // recyclerview에 어댑터 세팅 및 데이터 넘겨주기
        recyclerview.adapter = recyclerviewAdapter().apply {
            setRecyclerview(list)
        }
    }
}

 

자세한 내용은 공식문서를 참고 바랍니다.

https://developer.android.com/guide/topics/ui/layout/recyclerview?hl=ko

'안드로이드 > XML' 카테고리의 다른 글

SearchView  (2) 2024.07.14
TimePicker  (1) 2024.07.14
[Layout] CoordinatorLayout  (0) 2024.07.13
[안드로이드] RecyclerView Click Event  (0) 2023.11.30