MVVM 패턴을 최대한 적용해서하느라 어떻게 해야할지 감이 잘안오는데..
단순 TabLayout의 Tab의 타이틀을 셋팅하는데에도 뷰모델의 LiveData나 oberserve 클래스같은것이 필요할까
요?
제 앱에서는 탭레이아웃의 타이틀이라는게 한번 세팅되고 변하지 않습니다.
그런데 LiveData나 oberserver 를 사용하면 라이브데이터의 변화를 관찰해서 뷰를 업데이트 하잖아요?
그런데 탭이라는게 여러 탭에 존재하고 한번에 세팅되다보니까 이게 맞는지 observer를 사용하는게
맞는지 모르겠습니다...
아니면 MVVM 패턴에서 꼭 LiveData, Databinding 같은것을 사용할 필요는 없다고 들었습니다..
그래서 생각해본게 탭의 타이틀에 MVVM 패턴을 적용하려면 뷰모델 클래스에 tab의 position값을 넘긴후에
viewmodel 클래스에서 positioin 값에 맞는 타이틀값을 넘겨받아 뷰에 셋팅하면 될까요?
일단 어떻게 해야할지 몰라 livedata와 observe 를 사용한 코드는 올려놓겠습니다.
class WorkoutListTabFragment : Fragment() {
private var _binding: FragmentWorkoutListTabBinding? = null
private val binding get() = _binding!!
private lateinit var adapter: WorkoutListPagerAdapter
private val viewModel: WorkoutListTabViewModel by viewModels { WorkoutListTabViewModelFactory() }
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View? {
_binding = FragmentWorkoutListTabBinding.inflate(inflater, container, false)
return binding.root
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
adapter = WorkoutListPagerAdapter(this)
binding.apply {
pager.adapter = adapter
TabLayoutMediator(tabs, pager) { tab, position ->
tab.text = "TEST${(position+1)}" // TODO: set Tab Title
}.attach()
}
viewModel.tab.observe(viewLifecycleOwner) {
}
}
override fun onDestroy() {
super.onDestroy()
_binding = null
}
}
class WorkoutListTabViewModel : ViewModel(){
private val _tab = MutableLiveData<String>()
val tab get() = _tab
private val list = listOf(
"CHEST", "BACK", "LEG", "SHOULDER", "BICEPS", "TRICEPS", "ABS"
)
fun set(pos: Int) {
_tab.value = list[pos]
}
}