티스토리 뷰
뷰 모델 클래스를 사용할 때, 함께 사용할 수 있는 좋은 기능이 라이브 데이터입니다.
라이브 데이터는 관찰 가능한 데이터를 담아두는 클래스입니다.
쉽게 말해, 데이터를 지켜보고 있다가 변경이 되면, 화면을 다시 그려줄 수 있도록 도와줍니다.
먼저 라이브 데이터의 기본적인 구성을 알아 봅시다.
라이브 데이터의 객체를 만드는 방법은 다음과 같습니다. currentName 변수는 라이브 데이터를 식별하는 역할을 합니다.
class NameViewModel : ViewModel() {
val currentName: MutableLiveData<String> by lazy {
MutableLiveData<String>()
}
** 뷰 모델 클래스 내용 **
}
이제 액티비티에 정의된 함수 부분을 살펴 봅니다. nameObserver 부분이 변경된 내용을 감지하고, 다시 UI를 개편해주는 곳입니다. nameObserver는 다음 라인의 observe 메소드에 지정됩니다. currentName은 라이브 데이터로 만들어진 관찰 가능하는 객체입니다.
class NameActivity : AppCompatActivity() {
private val model: NameViewModel by viewModels()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val nameObserver = Observer<String> { newName ->
nameTextView.text = newName
}
model.currentName.observe(this, nameObserver)
}
}
그럼 라이브 데이터를 어떻게 실제로 적용해야 할까요?
우선 액티비티에서 실제 데이터 변경이 이루어지는 메소드를 확인하고, 거기에 라이브 데이터를 적용시키면 됩니다.
먼저 뷰 모델 클래스에 라이브 데이터를 선언하고, 데이터 변동이 이루어지는 곳에 라이브 데이터의 value 값을 변동되는 데이터로 교체해 줍니다. todoLiveData는 List<Todo>의 값이 수정될 수 있도록 MutableLiveData로 값으로 넘겨줍니다.
class MainViewModel: ViewModel(){
val todoLiveData = MutableLiveData<List<Todo>>()
private val data = arrayListOf<Todo>()
fun toggleTodo(todo: Todo) {
todo.isDone = !todo.isDone
todoLiveData.value = data
}
fun addTodo(todo: Todo){
data.add(todo)
todoLiveData.value = data
}
fun deleteTodo(todo: Todo){
data.remove(todo)
todoLiveData.value = data
}
}
실제 데이터가 변동되는 부분을 newData로 받은 뒤, notifyDataSetChanged( ) 해줍니다. 이때 TodoAdapter(private var dataSet: List<Todo>) 처럼, 어댑터 클래스의 dataSet은 변경 가능하도록 var로 설정합니다.
fun setData(newData: List<Todo>){
dataSet = newData
notifyDataSetChanged()
}
아래는 라이브 데이터를 관찰하고 UI를 업데이트 해주는 부분입니다. Observer가 해당 역할을 수행하는데, binding.recyclerView.adapter 부분 처럼, 리사이클러뷰의 어댑터는 setData를 가져오지 못하므로, TodoAdapter로 캐스팅하였습니다.
viewModel.todoLiveData.observe(this, Observer {
(binding.recyclerView.adapter as TodoAdapter).setData(it)
})
이렇게 라이브 데이터를 사용해서, 관리 포인트를 줄이고, 데이터 변동 코드도 간결하게 작성해 보았습니다.
'Android App Coding' 카테고리의 다른 글
뷰 모델 View Model (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
- ToDo List 앱 만들기
- Bmi Calculator
- 상대적 레이아웃
- 탭레이아웃
- 리스트뷰
- lazy init
- 인텐트
- 2021년 사건사고
- RecyclerView
- 2007년 사건사고
- 자바스크립트 배열
- 미제사건
- 리사이클러뷰
- 안드로이드 앱 만들기
- notifyDataSetChanged
- 메소드 오버라이딩
- 안드로이드 스튜디오 에러
- view binding
- 뷰 바인딩
- addView
- 애드뷰
- 2019년 사건사고
- 선형 레이아웃
- android adapter
- 대한민국 미제사건
- 안드로이드 어댑터
- tabLayout
- bmi 계산기 만들기
- 안드로이드 프로젝트
- findViewById
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |