You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.29 19:47:59