如何实现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
相关产品推荐
相关产品推荐

