Android视频播放器:将带resultLauncher的删除代码集成到RecyclerView Adapter
解决方案:将文件删除功能集成到RecyclerView Adapter及Activity中
一、Activity中配置IntentSenderLauncher
先在你的Activity里定义处理系统删除权限回调的IntentSenderRequest ResultLauncher:
class VideoPlayerActivity : AppCompatActivity() { // 注册删除请求的结果回调 private val deleteFileLauncher = registerForActivityResult( ActivityResultContracts.StartIntentSenderForResult() ) { result -> if (result.resultCode == RESULT_OK) { // 权限通过后,刷新RecyclerView列表 videoAdapter.notifyDataSetChanged() } } // 提供给Adapter调用的启动删除请求方法 fun launchDeleteRequest(intentSender: IntentSender) { val request = IntentSenderRequest.Builder(intentSender).build() deleteFileLauncher.launch(request) } // ... 其他Activity初始化逻辑(如RecyclerView、Adapter实例化) }
二、改造RecyclerView Adapter
通过接口回调(或高阶函数)实现Adapter与Activity的解耦,触发删除操作:
1. 用接口实现回调逻辑
在Adapter内部定义删除回调接口,用于通知Activity处理删除请求:
class VideoAdapter( private val videoList: MutableList<VideoItem>, private val deleteCallback: DeleteCallback ) : RecyclerView.Adapter<VideoAdapter.VideoViewHolder>() { interface DeleteCallback { fun onDeleteRequested(videoItem: VideoItem) } inner class VideoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(videoItem: VideoItem) { // ... 绑定视频数据到视图组件 // 绑定删除按钮点击事件 itemView.btn_delete.setOnClickListener { deleteCallback.onDeleteRequested(videoItem) } } } // ... 实现Adapter的onCreateViewHolder、onBindViewHolder等方法 }
2. Activity中实现回调并执行删除
在Activity中实现Adapter的DeleteCallback接口,调用你的deleteFile方法完成删除流程:
class VideoPlayerActivity : AppCompatActivity(), VideoAdapter.DeleteCallback { private lateinit var videoAdapter: VideoAdapter override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_video_player) // 初始化视频列表数据 val videoList = mutableListOf<VideoItem>() // 实例化Adapter并传入回调 videoAdapter = VideoAdapter(videoList, this) recyclerView.adapter = videoAdapter } override fun onDeleteRequested(videoItem: VideoItem) { // 调用自定义的deleteFile方法,传入目标文件Uri deleteFile(videoItem.fileUri) } // 你的文件删除方法,生成系统删除请求 private fun deleteFile(fileUri: Uri) { val pendingIntent = MediaStore.createDeleteRequest(contentResolver, listOf(fileUri)) // 启动删除权限请求 launchDeleteRequest(pendingIntent.intentSender) } }
三、优化与注意事项
- 权限合规:Android 11及以上版本必须使用
MediaStore.createDeleteRequest发起删除请求,不能直接删除文件,否则会触发权限异常。 - 列表高效刷新:删除成功后,建议先从数据源
videoList中移除对应项,再调用adapter.notifyItemRemoved(position),比notifyDataSetChanged()更高效。 - 简化回调(可选):如果用Kotlin开发,可以用高阶函数替代接口,代码更简洁:
// Adapter改造 class VideoAdapter( private val videoList: MutableList<VideoItem>, private val onDeleteClick: (VideoItem) -> Unit ) : RecyclerView.Adapter<VideoAdapter.VideoViewHolder>() { inner class VideoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) { fun bind(videoItem: VideoItem) { itemView.btn_delete.setOnClickListener { onDeleteClick(videoItem) } } } } // Activity中初始化Adapter videoAdapter = VideoAdapter(videoList) { videoItem -> deleteFile(videoItem.fileUri) }
内容的提问来源于stack exchange,提问作者Ayan Mishra
相关产品推荐
相关产品推荐

