[Android] 프로젝트에 ViewModel과 LiveData 적용 + 개발일지

 

[개발 일지]

 

이전에 공부한 viewmodel과 liveData를 프로젝트에 적용했다.

내가 원하는 기능은 총 3가지였다.

 

1. 각 calendar에서 날짜를 클릭하면 해당 일에 해당하는 뷰 나타남

2. 뷰에서 새로운 todo 추가 시 해당 일자에 데이터 추가

3. 각 일자별로 다른 데이터 ( 리싸이클러뷰) 

 

일자별로 다른 todo Data가 적용되게 하는 것이 중요했다.

key - value로 값을 관리하는 HashMap 방법을 사용하기로 결정했다.

 

var recentlyAddData = MutableLiveData<HashMap<String,ArrayList<Todo>>>()
var todoData = HashMap<String, ArrayList<Todo>>()
var currentMonthArr = ArrayList<Todo>()

 

LiveData , LiveData를 갱신할 todoData, todoData 내부의 List를 갱신할 currentMonthArr를 선언했다.

 

값을 추가하는 방식은 아래와 같다.

 

1. todoData에 해당 key 값(날짜의 정보를 저장한)이 있는지 확인한다.

2. 키 값이 있다면 기존 데이터가 todoData[key]의 값이 된다.

3. 키 값이 없다면 데이터를 빈 리스트로 초기화 해준다.

4. 새로 들어온 데이터를 기존값에 추가한다.

5. 키 값에 새로 들어온 데이터 + 기존 값을 추가한다.

 


fun addTodoData(key:String,text:String){
    if (todoData[key] !=null){
        currentMonthArr = todoData[key]!!
    }else{
        currentMonthArr = ArrayList()
    }
    currentMonthArr.add(Todo(null,key,text,false))
    todoData[key] = currentMonthArr

    recentlyAddData.value = todoData

}

 

이전에 작성한 addToDoData를 수정했다.

currentMonthArr을 hash 의 값인  데이터로 설정하고 key - currentMonthArr 을 연결한다.

최종적으로는 LiveData에 새로 만들어준 todoData (기존 + 새로 들어온 데이터)를 연결해준다.

 

이제 observe를 통해서 데이터의 추가가 감지되면 기존의 key 값과 연결 된 데이터에 신규 데이터를 추가해준다.

 

mainActivity.viewModel.recentlyAddData.observe(mainActivity, Observer {
    it[keyDay]?.let { keyData ->
        (recentlyListRecycler.adapter as ToDoCalendarAdapter).setData(keyData)
    }
})

 

key에 관련 데이터가 있다면 Recycler View에 만들어준 데이터 갱신 함수인 setData를 실행한다.

 

입력 버튼을 눌렀을 경우 새로운 데이터를 추가한다.

여기서 key는 해당 날짜로 만든 키 값이고 editTypingView.text는 유저가 입력한 editText이다.

 

addButton.setOnClickListener {
    mainActivity.viewModel.addTodoData(keyDay,editTypingView.text.toString())
}

 

원하는 방식으로 데이터 추가를 성공했다.

이제 다음에는 데이터를 삭제, 수정하거나 변경하는 코드를 작성해야겠다.