티스토리 뷰

Android

[Kotlin] RecyclerView 샘플

개발자 요콩 2018. 9. 11. 13:32

안드로이드 사용하면서 가장 많이 사용하는 위젯 중 하나는 RecyclerView 일 것 입니다.


자바로 손 쉽게 만들던 RecyclerView를 막상 Kotlin 공부하면서 구현하려니 순간 막막해지는 경험이 있어서 샘플을 정리 하려 합니다.


1. 샘플이니 Activity에 RecyclerView만 보여줄 것 입니다..


activity_main.xml

<android.support.constraint.ConstraintLayout
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<android.support.v7.widget.RecyclerView
android:id="@+id/rv_main_list"
android:layout_width="0dp"
android:layout_height="0dp"
app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintLeft_toLeftOf="parent"
app:layout_constraintRight_toRightOf="parent"
app:layout_constraintTop_toTopOf="parent" />

</android.support.constraint.ConstraintLayout>


2. Activity 에서 kotlin extensions을 사용하여 별도의 findViewById 없이 View를 사용할 수 있습니다.

RecyclerView 에 Adapter 와 LayoutManager를 지정해 줍니다.


자바에 비해서 참 심플해 졌습니다.


MainActivity.kt

class MainActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)

rv_main_list.adapter = MainAdapter()
rv_main_list.layoutManager = LinearLayoutManager(this)
}
}


3.  Adapter와 Item을 생성해 줍니다.


data class를 사용하여 getter, setter 정의할 필요 없이 간단하게 VO클래스를 만들 수 있습니다.


MainData.kt

data class MainData(val title:String, val content:String)


4. ItemView 레이아웃을 정의합니다. 


Title 과 Content 정보를 보여주도록 하겠습니다.


item_main.xml

<android.support.design.card.MaterialCardView
xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_margin="10dp">
<RelativeLayout
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_margin="20dp"
android:orientation="vertical">
<TextView
android:id="@+id/tv_main_title"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
tools:text="TITLE"
/>
<TextView
android:id="@+id/tv_main_content"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_below="@id/tv_main_title"
android:layout_marginTop="10dp"
android:autoLink="web"
tools:text="Content"/>
</RelativeLayout>

</android.support.design.card.MaterialCardView>


5. Activity에 RecyclerView와 연결 되는 Adapter 와 ItemView 를 보여줄 Holder 를 만듭니다.


간단한 함수는 {} 필요 없이 = 으로 구현 할 수 있어서 코드가 많이 심플해 지고 보기도 좋아 졌습니다.


하드 코딩 되어있는 items에 대해서는 외부 자료를 넣기 위해서는 Activity에서 setItems() 호출하는 방식으로 변경 하면 됩니다.



MainAdapter.kt

class MainAdapter : RecyclerView.Adapter<MainAdapter.MainViewHolder>() {

var items: MutableList<MainData> = mutableListOf(MainData("Title1", "Content1"),
MainData("Title2", "Content2"),MainData("Title3", "Content3"))

override fun onCreateViewHolder(parent: ViewGroup, p1: Int) = MainViewHolder(parent)


override fun getItemCount(): Int = items.size

override fun onBindViewHolder(holer: MainViewHolder, position: Int) {
items[position].let { item ->
with(holer) {
tvTitle.text = item.title
tvContent.text = item.content
}
}
}

inner class MainViewHolder(parent: ViewGroup) : RecyclerView.ViewHolder(
LayoutInflater.from(parent.context).inflate(R.layout.item_main, parent, false)) {
val tvTitle = itemView.tv_main_title
val tvContent = itemView.tv_main_content
}
}


짠! Java보다 간단하게 RecyclerView를 생성하였습니다.




Kotlin으로 심플하게 RecyclerView를 구현하였습니다.


물론 실 개발에서는 다양한 Holder와 복잡한 ItemView layout 을 구현해야겠지만, 기본적인 RecyclerView 구조는 샘플을 사용하시면 됩니다.




예제 소스는 아래 github에서 보실 수 있습니다.


https://github.com/ykyahwa/KotlinSample/tree/1.Simple_RecyclerView

댓글
  • 프로필사진 sd 좋은 정보 감사합니다.
    MainActivity.kt에서 밑에 rv_main_list.adapter와 rv_main_list.layoutManager에서 adapter와 layoutManager가 빨간색으로 나옵니다.
    문제가 무엇인지 잘 모르겠네요!
    2020.05.12 17:04
  • 프로필사진 개발자 요콩 해결하셨을거 같긴한데. 빌드 중 문제가 있는거 같네요. clean - rebuild 해보셨나요??
    정확한 에러메시지를 알려주셔야 도와드릴수 있어요~~
    2020.05.21 15:51 신고
댓글쓰기 폼