코틀린 리사이클러뷰 예제
매인액티비티 생성.
MainActivity.kt
//////////////////////////////////////////////////////////////////////////////////////////
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
}
}
//////////////////////////////////////////////////////////////////////////////////////////
Build.gradle(Module:app)에 com.android.support:recyclerview-v7 모듈 추가
//////////////////////////////////////////////////////////////////////////////////////////
dependencies {
implementation fileTree(include: ['*.jar'], dir: 'libs')
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
//리사이클러뷰 모듈 추가.
implementation 'com.android.support:recyclerview-v7:28.0.0'
}
//////////////////////////////////////////////////////////////////////////////////////////
리사이클러뷰에 사용할 데이터 생성.
간단한 데이터 출력 하기위한 클래스 생성.
People.Kt
//////////////////////////////////////////////////////////////////////////////////////////
/**
* 데이터 클래스 생성 및 초기화
* 바로 생성자를 넣어서 만들어지게 구현.
* 코틀린에서는 data class 를 지원 하며
* java에서 처럼 toString 처리 하지 않아도 됨.
*/
data class People(val name: String, val age: String, val address: String)
//////////////////////////////////////////////////////////////////////////////////////////
리사이클러뷰에 보여줄 row layout 생성.
간단히 name, age, address 보여줌.
listview_row.xml
//////////////////////////////////////////////////////////////////////////////////////////
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.constraint.ConstraintLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginLeft="10dp"
android:layout_marginTop="10dp"
android:layout_marginRight="10dp"
app:layout_constraintTop_toTopOf="parent">
<TextView
android:id="@+id/name"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="name"
app:layout_constraintTop_toTopOf="parent" />
<TextView
android:id="@+id/age"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="age"
app:layout_constraintTop_toBottomOf="@+id/name" />
<TextView
android:id="@+id/address"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="address"
app:layout_constraintTop_toBottomOf="@+id/age" />
</android.support.constraint.ConstraintLayout>
</android.support.constraint.ConstraintLayout>
//////////////////////////////////////////////////////////////////////////////////////////
뷰홀더 클래스 생성. RecyclerView.ViewHolder 상속
TestHolder_01.kt
//////////////////////////////////////////////////////////////////////////////////////////
/**생성자 지정 , 상위클래스 view 넘겨줌. super(itemView);*/
class TestHolder_01(itemView: View) : RecyclerView.ViewHolder(itemView) {
// 뷰 홀더를 상속 받고나면 생성자에서 상위 홀더에 view 를 전달.
val name: TextView
val age: TextView
val address: TextView
/**
* 코틀린사용한 초기화
* 초기화 블럭.
*/
init {
this.name = itemView.findViewById(R.id.name)
this.age = itemView.findViewById(R.id.age)
this.address = itemView.findViewById(R.id.address)
}
/**팩토리 함수 */
companion object {
fun newInstance(viewGroup: ViewGroup): TestHolder_01 {
val view = LayoutInflater.from(viewGroup.context).inflate(R.layout.listview_row, viewGroup, false)
return TestHolder_01(view)
}
}
fun onBindView(position: Int, list: ArrayList<People>) {
// 데이터를 화면에 그리기.
name.text = list[position].name
age.text = list[position].age
address.text = list[position].address
}
}
//////////////////////////////////////////////////////////////////////////////////////////
리사이클러뷰 아답터 생성.
TestAdapter_01.kt
//////////////////////////////////////////////////////////////////////////////////////////
/**생성자에서 리스트를 받아옴.*/
class TestAdapter_01(val list: ArrayList<People>) : RecyclerView.Adapter<TestHolder_01>() {
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): TestHolder_01 {
//팩토리함수를 이용한 뷰홀더 생성.
return TestHolder_01.newInstance(p0)
}
override fun getItemCount(): Int {
return list.size
}
override fun onBindViewHolder(p0: TestHolder_01, p1: Int) {
// 홀더에 정의된 함수로 뷰 그리기
p0.onBindView(p1, list)
}
}
//////////////////////////////////////////////////////////////////////////////////////////
activity_main.xml
//////////////////////////////////////////////////////////////////////////////////////////
<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.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">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
app:layoutManager="android.support.v7.widget.LinearLayoutManager">
</android.support.v7.widget.RecyclerView>
</android.support.constraint.ConstraintLayout>
//////////////////////////////////////////////////////////////////////////////////////////
MainActivity.kt
//////////////////////////////////////////////////////////////////////////////////////////
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
//UI그리기
setupUI()
}
//data 생성
fun setData(): ArrayList<People> {
val list = arrayListOf<People>()
for (i in 0 until 30) {
list.add(People("$i name", "$i age", "$i address"))
}
list.forEach {
Log.e("log", "$it")
}
return list
}
fun setupUI() {
//아답터 등록 후 끝.
recyclerView.adapter = TestAdapter_01(setData())
}
}
//////////////////////////////////////////////////////////////////////////////////////////