사용자가 받고 싶은 알림을 체크 형태로 제공하는데, 체크 해놓은 사항이 지속적으로 저장되어 반영되어야 할 것이다. 이를 위해서 Room DB를 사용했다.
수정 : 생각해보니 여기에 각자가 적어둔 가이드라인까지 붙이면 더 좋은 효율을 발휘할 것 같다!!
첫 진입 액티비티에서 다음 로직을 처리한다!
getAllData을 통해 DB에 저장된 값을 가져오는데 이게 비어있다면 초기화 하는 코드를 작성한다.
그리고 중요한 건 메인스레드는 UI처리를 해야하기에 코루틴을 이용해 비동기 처리로 실행한다!
CoroutineScope(Dispatchers.IO).launch {
val existingData = dataRepository.getAllData()
if (existingData.isEmpty()) {
dataRepository.insertInitialData()
}
}
DB에 저장된 ischecked의 값을 가져와서 DataList에 값을 수정해주고 수정된 값을 어댑터에 달아서 보내준다!
disasterRepository = DataRepository(AppDatabase.getDatabase(this).dataDao())
CoroutineScope(Dispatchers.Main).launch {
val isCheckedList = disasterRepository.getIsCheckedList()
Log.d("재난", isCheckedList.toString())
// DataList을 반복문을 통해 업데이트
for (i in 0 until minOf(DataList.size, isCheckedList.size)) {
DataList[i].ischecked = isCheckedList[i]
}
// DataList가 업데이트되었으므로 UI 요소를 설정
binding = ActivitySetDisasterBinding.inflate(layoutInflater)
var view = binding.root
setContentView(view)
binding.listview.adapter = ListViewAdapter(this@setDisasterActivity, DataList)
binding.btnBack.setOnClickListener {
super.onBackPressed()
}
}
어댑터의 getView쪽에 정의를 했고
클릭에 대한 리스너를 달아주고 체크 여부를 변경해 UI를 먼저 변경하고 변경된 UI 값을 이용해서 코루틴 속에서 DB값까지 변경해주는 모습이다!
view.setOnClickListener {
// 아이템을 클릭하면 체크 상태를 토글합니다.
DataList[position].ischecked =
if (data.ischecked == 0) 1
else 0
val dataDao = AppDatabase.getDatabase(this.context).dataDao()
val dataRepository = DataRepository(dataDao)
CoroutineScope(Dispatchers.IO).launch {
if(DataList[position].ischecked == 1){
dataRepository.updateIsCheckedValue(position+1, 1)
}
else{
dataRepository.updateIsCheckedValue(position+1, 0)
}
//Log.d("재난", "$position")
}
notifyDataSetChanged() // 어댑터에게 업데이트된 데이터를 알려줍니다.
}
나갔다가 다시 들어와도 잘 된다.