我正在上课制作Android闹钟应用。警报显示在主要活动的recyclerview内部,我希望将其按下后删除。我可以从设置的警报数据库中清除它,但是我无法访问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)
}
}
在最后三行中,上下文具有类型不匹配,因为这是MyAdapter类型-我不确定我需要在此处输入什么,类似于我假设的MainActivity.context
getSystemService还将类型推断错误显示为字符串,并且我认为这会导致context.ALARM_SERVICE的类型不匹配,而是字符串而不是上下文。
正确的上下文是什么,如何访问适配器内部的AlarmManager?
您可以使用项目视图的上下文:
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)