티스토리 뷰
앱 제작 시 안드로이드 생명 주기에 따라 회전 처리가 이루어지면 앱의 데이터가 날라가 버리게됩니다.
이러한 부분을 방지하기 위해 뷰 모델 클래스를 사용됩니다. 뷰 모델을 사용하면, 화면 회전 같은 변경된 구성에서도 데이터를 계속 유지할 수 있습니다.
우선, 아래의 이미지를 먼저 확인해 봅시다.
액티비티 생명주기가 진행되는데, 회전이 이루어지면 onPause ~ onDestroy ~ onCreate 등과 같이 액티비티가 없어지고 재생산됩니다. 뷰 모델 클래스 안에 데이터가 구현되는 담게 되면, 구성이 변경되더라도 담고 있는 내용이 유지되고 onCleared가 호출됩니다.
그럼 뷰 모델 클래스의 기본 코드를 살펴 봅시다.
아래와 같이 ViewModel을 상속받아, 나만의 뷰 모델 클래스를 작성해주면 됩니다. 클래스 안에 필요한 변수나 메소드를 정의해 줍니다.
class MyViewModel : ViewModel() {
private val users: MutableLiveData<List<User>> by lazy {
MutableLiveData<List<User>>().also {
loadUsers()
}
}
fun getUsers(): LiveData<List<User>> {
return users
}
private fun loadUsers() {
}
}
뷰 모델 클래스를 만들면, 다음의 액티비티 클래스에서 뷰 모델을 사용하면 됩니다. by viewModels() 지시어를 통해서 직접 만든 뷰 모델을 model에 담아줍니다.
이후로 뷰 모델 클래스에 정의되었던, getUsers(): LiveData<List<User>> 메소드에 observe 메소드를 사용합니다. 해당 함수를 관찰하다가 데이터가 변경되면, users로 넘겨 받아 함수 블록 부분에서 UI를 업데이트해주는 형태입니다.
class MyActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
val model: MyViewModel by viewModels()
model.getUsers().observe(this, Observer<List<User>>{ users ->
})
}
}
그럼 실제로 뷰모델을 어떻게 사용하는지 알아보겠습니다.
뷰모델을 실제로 사용하려면 KTX 모듈 아티팩트를 gradle 모듈 단위에 정의해줘야 합니다. 아래와 같이 build.gradle의 모듈 단위에 아티팩트 사용을 위한 KTX를 implementation합니다.
dependencies {
implementation "androidx.fragment:fragment-ktx:1.3.6"
}
뷰 모델을 사용하려면, 자바 가상 머신이 자바 8의 언어 기능과 API를 사용할 수 있도록 해야 합니다. 따라서 Android Gradle 플러그인의 버전에 따라, build.gradle 모듈 단위에 아래와 같은 코드를 심어주도록 합니다.
* Android Gradle 플러그인 3.0.0 이상
android {
kotlinOptions {
jvmTarget = "1.8"
}
}
* Android Gradle 플러그인 4.0.0 이상
dependencies {
coreLibraryDesugaring("com.android.tools:desugar_jdk_libs:1.1.5")
}
메인 액티비티에 먼저 뷰 모델을 사용하도록 선언합니다. by 지시어를 이용한 점을 잊지 마시기 바랍니다.
private val viewModel: MainViewModel by viewModels()
준비가 되면, 뷰 모델 클래스를 만들어줍니다. 뷰 모델에 필요한 데이터와 메소드를 구현해줍니다.
class MainViewModel: ViewModel(){
val data = arrayListOf<Todo>()
fun toggleTodo(todo: Todo) {
todo.isDone = !todo.isDone
}
fun addTodo(todo: Todo){
data.add(todo)
}
fun deleteTodo(todo: Todo){
data.remove(todo)
}
}
그리고 onCreate 메소드 부분에서 뷰 모델을 통해 원하는 데이터와 메소드를 사용합니다. viewModel.data, viewModel.addTodo, viewModel.deleteTodo, viewModel.toggleTodo 에서 보다시피, 뷰 모델로 필요한 데이터와 메소드에 접근하고 있습니다.
binding.recyclerView.apply {
layoutManager = LinearLayoutManager(this@MainActivity)
adapter = TodoAdapter(
viewModel.data,
onClickDeleteIcon = {
viewModel.deleteTodo(it)
},
onClickItem = {
viewModel.toggleTodo(it)
}
)
}
binding.addButton.setOnClickListener {
val todo = Todo(binding.editText.text.toString())
viewModel.addTodo(todo)
}
그럼 뷰 모델에 대한 설명을 마치겠습니다.
'Android App Coding' 카테고리의 다른 글
라이브 데이터 Live Data (0) | 2021.08.08 |
---|---|
안드로이드 플래그 Flag (0) | 2021.08.08 |
뷰 바인딩/뷰 결합 View Binding (0) | 2021.08.07 |
안드로이드 스튜디오 단축키 Hot Keys (Window) (0) | 2021.07.20 |
안드로이드 권한 Permission (0) | 2021.07.18 |
- Total
- Today
- Yesterday
- 2021년 사건사고
- 대한민국 미제사건
- 선형 레이아웃
- 자바스크립트 배열
- 안드로이드 스튜디오 에러
- 2019년 사건사고
- tabLayout
- Bmi Calculator
- 미제사건
- 안드로이드 프로젝트
- findViewById
- 상대적 레이아웃
- 인텐트
- ToDo List 앱 만들기
- 애드뷰
- 리사이클러뷰
- 2007년 사건사고
- lazy init
- addView
- 메소드 오버라이딩
- android adapter
- 뷰 바인딩
- 안드로이드 앱 만들기
- 탭레이아웃
- 안드로이드 어댑터
- bmi 계산기 만들기
- RecyclerView
- 리스트뷰
- view binding
- notifyDataSetChanged
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |