본문 바로가기
Android Kotlin

AndroidStudio Jetpack LiveData

by 히예네 2023. 6. 2.
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
반응형