---
DailyLogFragment( A )
class DailyWorkoutLogFragment : Fragment() {
private var _binding: FragmentDailyWorkoutLogBinding? = null
private val binding get() = _binding!!
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?): View? {
_binding = FragmentDailyWorkoutLogBinding.inflate(inflater, container, false)
binding.btn.setOnClickListener {
findNavController().navigate(R.id.action_dailyWorkoutLogFragment_to_navigation)
}
return binding.root
}
}
AddRoutineFragment ( B )
class AddRoutineFragment : Fragment() {
private var _binding : FragmentAddRoutineBinding? = null
private val binding get() = _binding!!
private val vm : DetailViewModel by navGraphViewModels(R.id.navigation) {
DetailViewModelFactory(requireActivity().application,"")
}
private val epoxyController : AddRoutineController by lazy {
AddRoutineController()
}
override fun onCreateView(inflater: LayoutInflater,
container: ViewGroup?,
savedInstanceState: Bundle?): View? {
_binding = FragmentAddRoutineBinding.inflate(inflater, container, false)
binding.rv.adapter = epoxyController.adapter
binding.addRoutine.setOnClickListener {
findNavController().navigate(R.id.action_addRoutine_to_workoutListTabFragment)
}
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
// vm.workoutInfo.observe(viewLifecycleOwner) { routine ->
// epoxyController.setItem(routine)
// }
}
}
WriteDetail ( D )
class WriteDetailFragment : Fragment() {
private var _binding : FragmentWriteDetailBinding? = null
private val binding get() = _binding!!
private val args: WriteDetailFragmentArgs by navArgs()
lateinit var workout: String
private lateinit var adapter: DetailAdapter
private val vm : DetailViewModel by navGraphViewModels(R.id.navigation) {
DetailViewModelFactory(requireActivity().application, workout)
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
args.let {
Detail.title = it.workout.toString()
workout = it.workout.toString()
}
}
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
_binding = FragmentWriteDetailBinding.inflate(inflater, container, false)
adapter = DetailAdapter()
binding.apply {
rv.adapter = adapter
rv.itemAnimator = null
workout.text = args.workout
// 세트 추가
add.setOnClickListener {
vm.addSet()
}
// 세트 삭제
delete.setOnClickListener {
vm.deleteSet()
}
// 단위 변경
toggleButton.addOnButtonCheckedListener { _, checkedId, isChecked ->
if(isChecked) {
when(checkedId) {
R.id.kg -> vm.changeUnit(WorkoutUnit.kg)
R.id.lb -> vm.changeUnit(WorkoutUnit.lbs)
}
}
}
// 메모
memo.addTextChangedListener(object : TextWatcher {
override fun beforeTextChanged(s: CharSequence?, start: Int, count: Int, after: Int) {
}
override fun onTextChanged(s: CharSequence?, start: Int, before: Int, count: Int) {
}
override fun afterTextChanged(s: Editable?) {
// 메모 작성줄 2줄 제한
val editTextRowCount = memo.lineCount
if (editTextRowCount > 2) {
memo.text?.delete(memo.selectionEnd - 1, memo.selectionStart)
}
}
})
save.setOnClickListener {
vm.save()
findNavController().navigate(R.id.action_writeDetailFragment_to_addRoutine)
Toast.makeText(context, "눌렀땅", Toast.LENGTH_SHORT).show()
}
}
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
vm.items.observe(viewLifecycleOwner) { newList ->
adapter.submitList(newList) // 새로운 리스트를 넘김.
// adapter.submitList(vm.getList())
}
}
}
DetailViewModel
class DetailViewModel(application: Application, title: String) : ViewModel() {
private val workoutDao = DetailDatabase.getDatabase(application).workoutDao()
private val repository: WorkoutRepository = WorkoutRepository(workoutDao, title)
private var _items: MutableLiveData<List<WorkoutSetInfo>> = MutableLiveData()
var testNum : Int = 0
val items: LiveData<List<WorkoutSetInfo>>
get() = _items
fun changeUnit(unit: WorkoutUnit) {
repository.changeUnit(unit)
_items.postValue(repository.getList())
}
fun addSet() {
viewModelScope.launch(Dispatchers.IO){
repository.add()
_items.postValue(repository.getList()) // plus를 사용하면 새로운 List가 반환
}
testNum += 1
Log.i("TestNum", testNum.toString())
}
fun deleteSet() {
repository.delete()
_items.postValue(repository.getList())
}
fun save() {
viewModelScope.launch(Dispatchers.IO) {
repository.save()
}
}
}
WorkoutRepository
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 delete() {
if(setInfoList.size != 0) {
setInfoList.let { list ->
list.removeLast()
updatedList = list.toList()
}
}
return
}
fun save() {
val workoutId = workoutDao.insertWorkout(workout) // Workout 삽입 및 삽입된 Workout의 ID 반환
val newWorkoutSetInfoList = setInfoList.map { setInfo -> // workoutId를 기반으로 새 리스트 리턴
setInfo.copy(parentWorkoutId = workoutId)
}
workoutDao.insertSetInfoList(newWorkoutSetInfoList)
}
// toList를 하는 이유는 새로운 리스트를 반환하기때문에 postValue 가능하게끔 하기 위함
fun getList() : List<WorkoutSetInfo> = updatedList
}