首页 > 解决方案 > 从 RecyclerView 适配器内部访问 AlarmManager

问题描述

我正在课堂上制作一个 Android 闹钟应用程序。警报显示在主要活动的回收视图中,我希望在按下时将它们删除。我可以从我设置的警报数据库中清除它,但我无法访问 AlarmManager 来取消警报,而且 PendingIntent 的上下文似乎也是错误的。

 override fun onBindViewHolder(holder: RecyclerView.ViewHolder, index: Int) {
        val myViewHolder = holder as MyViewHolder
        val sdf = SimpleDateFormat("HH:mm EEEE")
        myViewHolder.tvAlarmTime.text = sdf.format(alarms[index].milliseconds)
        myViewHolder.tvAlarmFrequency.text = alarms[index].frequency
        myViewHolder.itemView.setOnClickListener {
            launch {
                withContext(Dispatchers.IO) {
                    val db = AlarmDatabase.getDatabase(myViewHolder.tvAlarmTime.context)
                    db.alarmDao().deleteTriggeredAlarm((alarms[index].id))
                }

            }
            val pi = PendingIntent.getBroadcast(this, (alarms[index].id).toInt(), Intent("alarmTask"), PendingIntent.FLAG_UPDATE_CURRENT)
            val alarmMgr = getSystemService(Context.ALARM_SERVICE) as AlarmManager
            alarmMgr.cancel(pi)

        }
    }

在最后 3 行中,上下文的类型不匹配,因为这是 MyAdapter 类型 - 我不确定我需要在这里放什么,类似于 MainActivity.context 我假设

getSystemService 还将类型推断错误显示为字符串,我认为这导致 context.ALARM_SERVICE 作为字符串而不是上下文的类型不匹配。

什么是正确的上下文以及如何访问适配器内的 AlarmManager?

标签: kotlinandroid-recyclerviewalarmmanagerandroid-contextandroid-pendingintent

解决方案


您可以使用项目视图的上下文:

val context = myViewHolder.itemView.context
val pi = PendingIntent.getBroadcast(context, (alarms[index].id).toInt(), Intent("alarmTask"), PendingIntent.FLAG_UPDATE_CURRENT)
val alarmMgr = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
alarmMgr.cancel(pi)

推荐阅读