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

如何实现RecyclerView列表项点击弹出删除确认对话框并删除该项?

实现RecyclerView列表项点击删除功能

我开发了一个基于RecyclerView的应用,接收用户输入的数据并展示在RecyclerView中。现在需要实现:点击RecyclerView列表项时,弹出AlertDialog询问是否删除该项;用户确认后,移除对应的列表项。

步骤1:修改Adapter类

  • 将数据源类型从List<Todo>改为MutableList<Todo>,确保能修改数据集合
  • 为列表项添加点击事件,触发删除确认对话框
  • 删除数据后调用RecyclerView的更新方法,保证界面同步

修改后的Adapter代码:

class TodoAdapter(val todos: MutableList<Todo>) : RecyclerView.Adapter<TodoAdapter.TodoViewHolder>() {
    inner class TodoViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView)

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): TodoViewHolder {
        val view = LayoutInflater.from(parent.context).inflate(R.layout.item_todo, parent, false)
        return TodoViewHolder(view)
    }

    override fun onBindViewHolder(holder: TodoViewHolder, position: Int) {
        holder.itemView.apply {
            tvTitle.text = todos[position].title
            cbDone.isChecked = todos[position].isChecked

            // 设置列表项点击事件
            setOnClickListener {
                val context = it.context
                AlertDialog.Builder(context)
                    .setTitle("确认删除")
                    .setMessage("确定要删除这个待办项吗?")
                    .setPositiveButton("删除") { _, _ ->
                        // 移除对应位置的数据
                        todos.removeAt(position)
                        // 通知RecyclerView移除指定项
                        notifyItemRemoved(position)
                        // 更新后续项的位置索引,避免出现显示错乱
                        notifyItemRangeChanged(position, todos.size)
                    }
                    .setNegativeButton("取消", null)
                    .show()
            }
        }
    }

    override fun getItemCount(): Int {
        return todos.size
    }
}

步骤2:调整MainActivity代码

原代码中已使用mutableListOf<Todo>作为数据源,只需修正AlertDialog的拼写错误,并优化用户体验(添加后清空输入框):

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val todolist = mutableListOf<Todo>()

        val adapter = TodoAdapter(todolist)
        rvTodos.adapter = adapter
        rvTodos.layoutManager = LinearLayoutManager(this)

        btnAddTodo.setOnClickListener {
            val title = etTodo.text.toString()
            if (title.isEmpty()) {
                AlertDialog.Builder(this)
                    .setTitle("提示")
                    .setMessage("标题不能为空")
                    .setPositiveButton("确定", null)
                    .setNegativeButton("取消") { _, _ ->
                        Toast.makeText(this, "请先输入标题", Toast.LENGTH_LONG).show()
                    }
                    .show()
            } else {
                val todo = Todo(title, false)
                todolist.add(todo)
                adapter.notifyItemInserted(todolist.size - 1)
                etTodo.text.clear() // 添加后清空输入框,提升体验
            }
        }
    }
}

关键说明

  • 修正了原代码中TodoViweholder的拼写错误,改为符合规范的TodoViewHolder
  • 使用notifyItemRemoved而非notifyDataSetChanged,实现局部刷新,提升性能
  • 通过notifyItemRangeChanged更新后续列表项的位置,避免因索引变化导致的显示异常

内容的提问来源于stack exchange,提问作者Sumita Das

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:07:08