itstudy-mary.tistory.com/209?category=929375
기존에 자바야 리사이클러뷰가 쉽고.... 회사 와서도 정말 엄청 많이 쓴게 리사이클러뷰이다.
이걸 이제 코틀린으로 개발한다.
리사이클러뷰에 필요한것은 두 가지이다
1. 리사이클러뷰의 데이터를 바인딩할 뷰홀더
2. 뷰홀더를 호출하고, 뷰홀더를 바인딩하는 어댑터
이 두 가지는 자바도 만들었지만 코틀린도 만들어야 한다 ^^ ..
먼저 뷰홀더를 만든다(필자는 이제 리사이클러뷰를 만들때 어댑터와 뷰홀더를 따로 쓰는 것이 익숙하다..)
-TestViewHolder.kt
package com.mary.kotlintest.adapter
import android.view.View
import androidx.recyclerview.widget.RecyclerView
import kotlinx.android.synthetic.main.viewholder_test.view.*
class TestViewHolder(v : View) : RecyclerView.ViewHolder(v) {
var view : View = v
fun updateView(item : String) {
view.textView.text=item
}
}
뷰를 선언하는 형태가 좀 달라졌다.
기존의 자바 뷰홀더는
1. 뷰 전역변수 초기화
2. 생성자를 따로 만들어 뷰를 호출한 후에
3. 뷰를 참조해야했는데,
코틀린은 그럴 필요 없이 어댑터에서 뷰를 선언할때 받아온 매개변수를 그대로 뷰로 활용할 수 있다.
뷰에서 뷰아이디를 찾아서 그대로 집어넣으면 끝난다.
그래서, 코틀린의 뷰홀더는 따로 implement 할 메서드가 없다.
- TestAdapter.kt
package com.mary.kotlintest.adapter
import android.view.LayoutInflater
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView
import com.mary.kotlintest.R
class TestAdapter(private val itemList : List<String>) : RecyclerView.Adapter<TestViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TestViewHolder {
val inflateView = LayoutInflater.from(parent.context).inflate(R.layout.viewholder_test, parent, false)
return TestViewHolder(inflateView)
}
override fun onBindViewHolder(holder: TestViewHolder, position: Int) {
val item = itemList[position]
holder.apply {
updateView(item)
}
}
override fun getItemCount(): Int {
return itemList.size
}
}
onCreate에는 큰 변화가 없지만 bind하는 방식에 변화가 생긴다. 홀더에 apply 하면 홀더 내부의 함수를 참조할 수 있어진다.
itemList를 직접 참조해도 되고, 아니면 notify를 사용해도 되고.. 이건 본인 재량인듯?
마지막으로 메인에서 어댑터와 레이아웃 매니저만 설정하면 완료된다.
package com.mary.kotlintest
import android.os.Bundle
import androidx.appcompat.app.AppCompatActivity
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.LinearLayoutManager
import com.mary.kotlintest.adapter.TestAdapter
import kotlinx.android.synthetic.main.activity_main.*
class MainActivity : AppCompatActivity() {
private val list : List<String> = listOf(
"test1", "test2", "test3", "test4"
)
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
loadText()
}
private fun loadText() {
textView.text = "테스트 아님"
val adapter = TestAdapter(list)
//val layoutManager = GridLayoutManager(this,2)
val layoutManager = LinearLayoutManager(this)
recyclerView.layoutManager = layoutManager
recyclerView.adapter = adapter
}
}
자주 사용하는 레이아웃 매니저는 linear이다.
말 그대로 linearLayout처럼 아래로 쭉 나온다.
그러나 한 요소를 표처럼 배치하고 싶어질때가 있는데, 그럴 때 이용하는 것이 GridLayoutManager이다.
(주석처리 되어있음. 기존 context가 첫번째 매개변수로, 두번째 매개변수는 span 값이 들어간다.)
'Android' 카테고리의 다른 글
Android Studio, JAVA] 안드로이드 intent cannot resolve constructor 오류 해결 (0) | 2021.03.09 |
---|---|
주니어가 하는 MVC패턴과 MVP 패턴에 대한 고찰....... (0) | 2021.01.28 |
Android Studio, Kotlin] 코틀린 익스텐션(findViewById 사용하지 않고 XML 요소 참조하기) (0) | 2020.12.29 |
Android Studio, JAVA] 컬러 그래디언트 만들기 (0) | 2020.11.25 |
Android Studio, JAVA ] sphere Panorama view (0) | 2020.11.20 |