簡體   English   中英

如何將 ViewModel 傳遞給適配器?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM