안드로이드 사용하면서 가장 많이 사용하는 위젯 중 하나는 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
'Android.log' 카테고리의 다른 글
Looper, Message, Handler 동작 (0) | 2019.01.06 |
---|---|
안드로이드 메인클래스 (0) | 2019.01.06 |
[31 Days Of Kotlin - 1일차] let, apply, with, run (0) | 2018.08.09 |
New Components in Design Support Library v28 (0) | 2018.07.27 |
ImageView ColorFilter 로 이미지 색변경하기 (0) | 2018.07.05 |