이름에서 알 수 있듯이 RecyclerView는 이러한 개별 요소를 재활용합니다. 항목이 스크롤되어 화면에서 벗어나더라도 RecyclerView는 뷰를 제거하지 않습니다. 대신 RecyclerView는 화면에서 스크롤된 새 항목의 뷰를 재사용합니다.

 

위의 소개한 글은 Google Android 개발자 문서의 RecyclerView 내용입니다.

 

 

RecyclerView로 동적 목록 만들기  |  Android 개발자  |  Android Developers

RecyclerView로 동적 목록 만들기   Android Jetpack의 구성요소 RecyclerView를 사용하면 대량의 데이터 세트를 효율적으로 표시할 수 있습니다. 개발자가 데이터를 제공하고 각 항목의 모양을 정의하면 R

developer.android.com

 

자 이제 간단하게 RecyclerView에 대해서 설명드리겠습니다.

 


RecyclerView

 

RecyclerView를 구성하기 위해 필요한 준비물은

다음과 같습니다.

 

1. AdpaterClass

2. ItemView (xml)

3. LayoutManager & RecyclerView

 

 


AdapterClass

 

class RecyclerViewAdapter(
    private val list: MutableList<String>
): RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder>() {

    private var itemLists: MutableList<String> = list

    inner class RecyclerViewHolder(
        private val itemView: View
    ) : RecyclerView.ViewHolder(itemView) {
        private val binding: ItemRecyclerviewBinding? = DataBindingUtil.bind(itemView)

        fun bind(position: Int) {
            binding?.let {
                it.tvItem.text = itemLists[position]
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewHolder {
        val view: View = LayoutInflater.from(parent.context)
            .inflate(R.layout.item_recyclerview, parent, false)
        return RecyclerViewHolder(view)
    }

    override fun onBindViewHolder(holder: RecyclerViewHolder, position: Int) {
        holder.bind(position)
    }

    override fun getItemCount(): Int = itemLists.size

    @SuppressLint("NotifyDataSetChanged")
    fun changeItemLists(list: MutableList<String>) {
        itemLists.clear()
        itemLists.addAll(list)
        notifyDataSetChanged()
    }
}

 

onCreateViewHolder() : RecyclerView ViewHolder를 새로 만들어야 할 때마다 이 메서드를 호출합니다. 이 메서드는 ViewHolder와 그에 연결된 View를 생성하고 초기화하지만 뷰의 콘텐츠를 채우지는 않습니다.

 

onBindViewHolder() : RecyclerView ViewHolder를 데이터와 연결할 때 이 메서드를 호출합니다. 이 메서드는 적절한 데이터를 가져와서 그 데이터를 사용하여 뷰 홀더의 레이아웃을 채웁니다. 

 

getItemCount() : RecyclerView는 데이터 세트 크기를 가져올 때 이 메서드를 호출합니다.

 


ItemView (item_recyclerview.xml)

 

<?xml version="1.0" encoding="utf-8"?>
<layout>
    <LinearLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <TextView
            android:id="@+id/tv_item"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="25dp"/>

    </LinearLayout>
</layout>

 


LayoutManager & RecyclerView

 

MainActivity

class MainActivity : AppCompatActivity() {
    private lateinit var binding: ActivityMainBinding
    private lateinit var rvAdapter: RecyclerViewAdapter
    private val list: MutableList<String> by lazy {
        mutableListOf(
            "one",
            "two",
            "three",
            "four",
            "five",
            "six",
            "seven",
            "eight",
            "nine",
            "ten"
        )
    }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        binding = DataBindingUtil
            .setContentView(this, R.layout.activity_main)

        rvAdapter = RecyclerViewAdapter(list)
        binding.rvEx.adapter = rvAdapter

    }
}

 

 

activity_main.xml

 

<layout>
    <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"
        tools:context=".MainActivity">

        <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_ex"
            android:layout_width="0dp"
            android:layout_height="150dp"
            app:layout_constraintTop_toTopOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"
            app:layoutManager="androidx.recyclerview.widget.LinearLayoutManager"/>

        <Button
            android:id="@+id/btn_refresh"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            app:layout_constraintBottom_toBottomOf="parent"
            app:layout_constraintStart_toStartOf="parent"
            app:layout_constraintEnd_toEndOf="parent"/>

    </androidx.constraintlayout.widget.ConstraintLayout>
</layout>

 

위와 같이 RecyclerView layoutManager 속성 값을 추가해줘야 합니다.

 

LinearLayoutManager

GridLayoutManager

StaggeredGridLayoutManager

 

 

 

[Android] RecyclerView 깜빡이는 현상 해결 (notifyDataSetChanged)

혹시 RecyclerView를 사용하면서 RecyclerView의 데이터 삭제 또는 추가 과정에서 RecyclerView가 깜빡이는 현상 때문에 고생하셨나요?? via GIPHY 위와 같은 현상에 대해서 알아보도록 하겠습니다. [Android] Kot

salmonpack.tistory.com

 


여기까지 저의 긴 글을 읽어주셔서 감사합니다.

제가 습관적으로 코딩을 하는 그날까지 습관적으로 코딩을 하기 위해 글 작성을 꾸준하게 하겠습니다.

  • 네이버 블러그 공유하기
  • 네이버 밴드에 공유하기
  • 페이스북 공유하기
  • 카카오스토리 공유하기