[개발 일지]
이전에 공부한 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())
}
원하는 방식으로 데이터 추가를 성공했다.
이제 다음에는 데이터를 삭제, 수정하거나 변경하는 코드를 작성해야겠다.