[英]Can I pass the ViewModel to a RecyclerView Adapter and observe a LiveData?
[英]How can i pass ViewModel into Adapter?
我有一個使用房間的提醒應用程序。 我有一個回收站視圖,其中包含通過從房間數據庫獲取所有提醒。 在每個元素中都存在結束提醒的計划日期。 當元素開始設置 position 時,我想檢查過期日期。 但我只有一個想法如何做到這一點。
我認為我需要檢查適配器中的過期日期,然后在適配器中調用視圖 model 並將數據發送到數據庫。 但是,我不能將視圖 model 傳遞給適配器。 無論如何,我讀了一些主題,他們說在視圖 model 中傳遞適配器的糟糕體驗。
有任何想法嗎?
這是我的適配器 class
class MainPageAdapter : RecyclerView.Adapter<MainPageAdapter.MyViewHolder>() {
private var remList = emptyList<ReminderModel>()
private lateinit var reminder : OverdueReminderModel
class MyViewHolder(itemView : View) : RecyclerView.ViewHolder(itemView) {}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): MyViewHolder {
return MyViewHolder(LayoutInflater.from(parent.context).inflate(R.layout.main_page_reminders_row, parent, false))
}
@SuppressLint("SetTextI18n")
override fun onBindViewHolder(holder: MyViewHolder, position: Int) {
val list = remList[position]
val sdf = SimpleDateFormat("dd.M.yyyy")
holder.itemView.idForDelete.text = list.id.toString()
holder.itemView.rowHeader.text = list.header
holder.itemView.goneDescription.text = list.description
holder.itemView.rowStartTime.text = list.startTime
holder.itemView.rowEndTime.text = sdf.format(list.endTime.toLong())
//redirect with safe args to show reminder
holder.itemView.rowOfMainPageItems.setOnClickListener {
val action = MainPageRemindersDirections.actionMainPageRemindersToShowFullReminder(list)
holder.itemView.findNavController().navigate(action)
}
val currentDate = Calendar.getInstance().timeInMillis.toString()
if(currentDate.toLong() > getDateInMills(holder.itemView.rowEndTime.text.toString())){
reminder = OverdueReminderModel(
0,
holder.itemView.rowHeader.text.toString(),
holder.itemView.goneDescription.text.toString(),
getDateInMills(holder.itemView.rowEndTime.text.toString()).toString()
)
}
//there are two methods which i want to use for sending and deleting data
/*
TODO:
overdueViewModel.addOverdueReminder(reminder)
deleteReminderFromDatabase(Integer.parseInt(viewHolder.itemView.idForDelete.text.toString()))
*/
}
override fun getItemCount(): Int {
return remList.size
}
@SuppressLint("NotifyDataSetChanged")
fun setData(reminder : List<ReminderModel>){
this.remList = reminder
notifyDataSetChanged()
}
@SuppressLint("SimpleDateFormat")
fun getDateInMills(date : String) : Long{
val sdf = SimpleDateFormat("dd.M.yyyy")
val dateParse = sdf.parse(date)
val dateInMills = dateParse.time
return dateInMills
}
}
這就是我在適配器中發送數據的方式
private lateinit var viewModel : ReminderViewModel
viewModel = ViewModelProvider(this).get(ReminderViewModel::class.java)
viewModel.readAllReminders.observe(viewLifecycleOwner, Observer {
adapter.setData(it)
})
您可以簡單地使用 Kotlin lambda 功能,
在您的適配器 Class 中添加這些功能和屬性
private lateinit var overdueCallback : (item: ReminderModel) -> Unit
fun overdueListener(callback: (item: ReminderModel) -> Unit){
overdueCallback = callback
}
如下調用ViewModel中的function,來處理item。
adapter.overdueListener{
//it: Reminder Model
// Code to handle the item from adapter
}
當您想將項目傳遞給 ViewModel 時,然后調用
overdueCallback(reminderItem)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.