티스토리 뷰

Android App Coding

라이브 데이터 Live Data

IT Knowledge Share 2021. 8. 8. 02:56
반응형

뷰 모델 클래스를 사용할 때, 함께 사용할 수 있는 좋은 기능이 라이브 데이터입니다.

라이브 데이터는 관찰 가능한 데이터를 담아두는 클래스입니다.

쉽게 말해, 데이터를 지켜보고 있다가 변경이 되면, 화면을 다시 그려줄 수 있도록 도와줍니다.

 

먼저 라이브 데이터의 기본적인 구성을 알아 봅시다.

 

라이브 데이터의 객체를 만드는 방법은 다음과 같습니다. 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)
})

이렇게 라이브 데이터를 사용해서, 관리 포인트를 줄이고, 데이터 변동 코드도 간결하게 작성해 보았습니다.

반응형
댓글