728x90
반응형
LiveData
옵저버블의 단점을 해결하기위해 생겨난 라이브러리
옵저버블의 단점: 액티비티가 꺼져도 비동기 작업으로인해 계속 보여주려고함
라이브데이터 : 액티비티가 꺼지면 그 이후에 변수가 바뀌어도 적용되지 못하게함.
코틀린에서는 어노테이션 해독기가 필요하다.
groovy가 아닌 kotlin script를 쓰는 사람은 버전까지 수정해줘야한다.
<Item>
data class Item(
var title : String,
var message : String
)
<MainActivity>
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
//화면은 바인딩이 만드는것이다.
val binding : ActivityMainBinding = DataBindingUtil.setContentView(this,R.layout.activity_main)
//binding.vm = MyViewModel()
val vm : MyViewModel = MyViewModel()
binding.vm = vm
//뷰모델 안에 있는 LiveData 변수를 관찰하는 설정
// vm.name.observe(this,object : Observer<String>{
// override fun onChanged(t: String?) {
// //이렇게 object 익명객체를 사용하는것은 너무 길어서 람다로 쓰는게 좋다.
// }
//
// })
//sam 변환으로 파라미터가 2개일때 (){}로 만들어도된다.
// vm.name.observe(this){
// Toast.makeText(this, "데이터변경 감지 : $it", Toast.LENGTH_SHORT).show()
// //여기서 name을 바꾸려면? textview에 id를 줘야한다... 뷰바인딩같은데!
// binding.tv.text = it
// }
//두번째방법
binding.lifecycleOwner=this
}
}
<MyBindingAdapter>
object MyBindingAdapter {
//리사이클러뷰에서 리스트데이터를 설정하는 새로운 속성을 만들기 [속성명 : itemList]
@BindingAdapter("itemList")
@JvmStatic
fun setItemList(view:RecyclerView, items:Any){
view.adapter = RecyclerItemAdapter(items as List<Item>)
}
}
<MyViewModel>
class MyViewModel {
//LiveData : Observalble와 다르게 라이프사이클에 따라 효율적으로 UI를 갱신
//원래는 옵저버블인데.. 이제 이거말고!
//("sam")은 초기값
val name : MutableLiveData<String> = MutableLiveData("sam")
val age : MutableLiveData<Int> = MutableLiveData(20)
//1.1 데이터 변경 콜백메소드
fun changeName(){
name.value = "Robin"
//라이브데이터를 다룰때 생각해야할점 : 옵저버블은 set해두면 원하지 않을때마다 변경되었지만, LiveData는 그걸 막아두었다.
//LiveData는 값을 변경한다고 해도 자동 갱신하지 않음...
//방법 1. LiveData 변수를 관찰하는 observe() 메소드를 통해서 관찰 및 UI를 갱신해야한다. -> 액티비티에서 한다.
//방법 2. LiveData의 변화를 반영할 LifeCycleOwner를 반영하자
}
fun increaseAge(){
//null이 아니야
age.value= (age.value)!!.toInt()+1
}
//2. 리사이클러뷰에 LiveData 변수 적용
val items : MutableLiveData<MutableList<Item>> = MutableLiveData(mutableListOf(Item("ahn","i love")))
//2.1 아이템추가하면 화면 자동 갱신
fun addItem(){
val list = items.value
list?.add(0,Item("안혜영","최고"))
items.value = list
}
}
<RecyclerItemAdapter>
class RecyclerItemAdapter(val items:List<Item>) : Adapter<RecyclerItemAdapter.VH>() {
//여기서 root는 뷰에대한 최상위, layout이 아니라 cardview이다.
inner class VH(val binding : RecyclerItemBinding) : ViewHolder(binding.root)
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): VH {
//parent.context : parent는 부모 뷰이다. 얘는 콘텐스트를 갖고잇다
val binding : RecyclerItemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.context),R.layout.recycler_item,parent,false)
return VH(binding)
}
override fun onBindViewHolder(holder: VH, position: Int) {
holder.binding.item = items[position]
}
override fun getItemCount(): Int {
return items.size
}
}
<bulid.gradle>
plugins {
alias(libs.plugins.com.android.application)
alias(libs.plugins.org.jetbrains.kotlin.android)
kotlin("kapt")
}
android {
namespace = "com.--------------------"
compileSdk = 33
defaultConfig {
applicationId = "com.-------------------"
minSdk = 24
targetSdk = 33
versionCode = 1
versionName = "1.0"
testInstrumentationRunner = "androidx.test.runner.AndroidJUnitRunner"
}
buildTypes {
release {
isMinifyEnabled = false
proguardFiles(
getDefaultProguardFile("proguard-android-optimize.txt"),
"proguard-rules.pro"
)
}
}
compileOptions {
sourceCompatibility = JavaVersion.VERSION_17
targetCompatibility = JavaVersion.VERSION_17
}
kotlinOptions {
jvmTarget = JavaVersion.VERSION_17.toString()
}
buildFeatures{
dataBinding =true
}
}
dependencies {
implementation(libs.core.ktx)
implementation(libs.appcompat)
implementation(libs.material)
implementation(libs.constraintlayout)
testImplementation(libs.junit)
androidTestImplementation(libs.androidx.test.ext.junit)
androidTestImplementation(libs.espresso.core)
}
728x90
반응형
'Android Kotlin' 카테고리의 다른 글
Android Studio 보일러플레이트 (0) | 2023.06.12 |
---|---|
AndroidStudio Coroutine : 경량스레드 (0) | 2023.06.05 |
Android Studio AutoCompleteTextView 클릭 시, Fragment로 전환하기 (0) | 2023.04.03 |
Android Studio strings.xml 사용하기 (0) | 2023.04.02 |
Android Studio 토글 누르면 DrawerLayout 꺼내기 ( setSupportActionBar로 ) (0) | 2023.03.31 |