【发布时间】:2023-03-29 13:37:01
【问题描述】:
请你回答我关于 MVVM 的一些问题
我目前正在制作一个锻炼日记应用程序,其中主要片段在列表中显示所有最新创建的练习 (RecyclerView) 还有一个片段是我创建这些练习的地方和一个日历片段,它在日历上用红点标记当天是否有锻炼
我想在日历下显示当我点击某个日期时我当天所做的练习列表。
现在是如何实现的:
这是我的日历课。我将 Materialcalendarview 库用于日历
class CalendarFragment : Fragment(), OnDateSelectedListener, OnMonthChangedListener {
private lateinit var mViewModel: CalendarVIewModel
private lateinit var binding: CalendarBinding
private val dates = ArrayList<CalendarDay>()
private var mExercises = ArrayList<Exercise>()
private val adapter = CalendarAdapter()
override fun onCreateView(
inflater: LayoutInflater, container: ViewGroup?,
savedInstanceState: Bundle?
): View? {
binding = CalendarBinding.inflate(inflater, container, false)
binding.calendarView.setOnDateChangedListener(this)
setupViewModel()
observerLiveData()
setupRV()
return binding.root
}
override fun onDateSelected(
widget: MaterialCalendarView,
date: CalendarDay,
selected: Boolean
) {
adapter.setList(getExerciseListOnThisData(date))
}
private fun setTrainingsInCalendar(exercise: List<Exercise>) {
val cal = Calendar.getInstance()
for (i in exercise.indices) {
cal.time = convertLongToTime(exercise[i].timestamp)
val month = cal[Calendar.MONTH]
val day = cal[Calendar.DAY_OF_MONTH]
val year = cal[Calendar.YEAR]
val temp: LocalDate = LocalDate.of(year, month + 1, day)
val dayd = CalendarDay.from(temp)
dates.add(dayd)
mExercises.add(exercise[i])
}
binding.calendarView.addDecorator(EventDecorator(Color.RED, dates))
}
private fun setupRV(){
binding.apply {
calendarRecyclerView.layoutManager = LinearLayoutManager(context)
calendarRecyclerView.adapter = adapter
}
}
private fun setupViewModel() {
mViewModel =
ViewModelProvider(this).get(CalendarVIewModel::class.java)
}
private fun observerLiveData() {
mViewModel.exercises.observe(viewLifecycleOwner){
setTrainingsInCalendar(it)
}
}
override fun onMonthChanged(widget: MaterialCalendarView?, date: CalendarDay?) {
}
private fun getExerciseListOnThisData(date: CalendarDay): List<Exercise>{
val mExercisesList = ArrayList<Exercise>()
for (i in mExercises.indices) {
if(calendarDay(mExercises[i].timestamp) == date){
mExercisesList.add(mExercises[i])
}
}
return mExercisesList
}
在有趣的 onDateSelected 中,我必须将这一天的练习列表传递给适配器。
第一个问题是:如何使用 MVVM 模式正确传递列表?
现在,当导航到片段时,我在片段的 ViewModel 中订阅了我的 LiveDate 。 LiveDate
我从一个房间的请求中得到
class CalendarVIewModel@ViewModelInject constructor(private val exercisesRepository: ExercisesRepository)
: ViewModel() {
val exercises: LiveData<List<Exercise>> =
exercisesRepository.allExercises
而且当我订阅 LiveData 时,我还会在有趣的 setTrainingsInCalendar 中膨胀我的
private var mExercises = ArrayList<Exercise>()
第二个问题是,这样做有多正确?也许在 ViewModel 中实现所有这些会更好? 还有第三个问题:在已经准备好的 List 的 Room DAO 中提出请求有多正确。例如,传递一个现成的练习列表,而不是订阅 LiveData,例如,像这样:
@Query("SELECT * FROM Exercises)
fun getAllExercises(): List<Exercise>>
setTrainingsInCalendar(exercise: List<Exercise> get from DAO Room)
谢谢。我只是 MVVM 的初学者
【问题讨论】:
-
I ask you to answer some of my questions我不认为这是获得 SO 答案的最佳方法,你最好一次问一个具体问题,这只是我的建议