정확하게는 모르겠지만.. codelabs의 코드를 보고 따라서 코드를 변경하고 있는데
실행은 됩니다만 다른점이 데이터를 추가할때 리스트의 이전의 데이터가 계속 유지됩니다.
왜 그런걸까요?
뷰를 사용한 Android Room - Kotlin | Android 개발자 | Android Developers
해당 페이지의 코드를 보고 비슷하게 변경하고 코드를 추가햇습니다.
변경점은 코드내에 주석으로 표시해두겠습니다.
흐름은 내비게이션 그래프로 A -> B -> C 화면을 반복하고
C화면에서 setInfo 를 List에 추가하고 A로 되돌아가서 반복합니다.
그런데 C에서 데이터를 추가할때 이전의 데이터가 지속적으로 남아있습니다.
예를들어 첫번째 추가에서 List<SetInfo>에 3개를 추가했다치면 size가 3이겠지요.
두번째로 추가할때에는 이 List<SetInfo>가 빈 리스트여야하는데 size가 3인채로 유지가 되어있습니다.
뭐가 문제일까요
--
WriteDetail
class WriteDetailFragment : Fragment() {
private val vm : DetailViewModel by viewModels {
// 이전 코드
// DetailViewModelFactory(requireActivity().application, workout)
// 변경 코드
DetailViewModelFactory(
(requireActivity().application as WorkoutApplication).repository,
workout
)
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentWriteDetailBinding.inflate(inflater, container, false)
binding.apply {
add.setOnClickListener {
vm.addSet()
}
save.setOnClickListener {
val action = WriteDetailFragmentDirections.actionWriteDetailFragmentToAddRoutine()
findNavController().navigate(action)
}
}
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
vm.items.observe(viewLifecycleOwner) { newList ->
adapter.submitList(newList)
}
}
}
WorkoutApplication // 새로추가함
class WorkoutApplication : Application() {
val database by lazy { WorkoutDatabase.getDatabase(this) }
val repository by lazy { WorkoutRepository(database.workoutDao(),"") }
}
DetailViewModelFactory
class DetailViewModelFactory(
// 변경 전
// val application: Application
// 변경 후
private val repository: WorkoutRepository,
private val title: String) : ViewModelProvider.Factory {
override fun <T : ViewModel?> create(modelClass: Class<T>): T {
if (modelClass.isAssignableFrom(DetailViewModel::class.java))
return DetailViewModel(
// Previous
// application,
// Current
repository,
title) as T
throw IllegalAccessException("Unknown ViewModel Class")
}
}
ViewModel
class DetailViewModel(
// 변경 전
// application: Application,
// 변경 후
val repository: WorkoutRepository,
title: String
) : ViewModel() {
// 변경 전
// private val workoutDao = WorkoutDatabase.getDatabase(application).workoutDao()
// private val repository: WorkoutRepository = WorkoutRepository(workoutDao, title)
private var _items: MutableLiveData<List<WorkoutSetInfo>> = MutableLiveData()
val items: LiveData<List<WorkoutSetInfo>>
get() = _items
fun addSet() {
viewModelScope.launch(Dispatchers.IO){
repository.add()
_items.postValue(repository.getList())
}
}
}
WorkoutRepo
class WorkoutRepository(private val workoutDao : WorkoutDao, title: String) {
private val workout = Workout(title = title)
private var setInfoList = ArrayList<WorkoutSetInfo>()
lateinit var updatedList : List<WorkoutSetInfo>
fun changeUnit(unit: WorkoutUnit) {
updatedList = setInfoList.map { setInfo ->
setInfo.copy(unit = unit)
}
}
fun add() {
setInfoList.let { list ->
val item = WorkoutSetInfo(set = setInfoList.size + 1)
list.add(item)
updatedList = setInfoList.toList()
}
}
fun getList() : List<WorkoutSetInfo> = updatedList
}