android-studio - RecyclerView(Kotlin):使用 SQL 数据库中的数据在 ToDo 应用程序上添加滑动以删除功能
问题描述
我是 kotlin 和 android studio 的新手,目前我正在尝试用自己的想法构建一个待办事项列表应用程序。它大部分都完成了,但我必须向用户添加的任务添加编辑和删除功能。用户添加的任务使用 SQLiteDatabase 存储在设备上。这是我写的删除类的基本滑动:
abstract class SwipeToDelete(context: Context, dragDir: Int, swipeDir: Int): ItemTouchHelper.SimpleCallback(dragDir, swipeDir) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
TODO("Not yet implemented")
}
}
这是我添加的删除功能,可以很好地使用按钮:
fun deleteToDo(todoId: Long){
val db = writableDatabase
db.delete(TABLE_TODO_ITEM,"$COL_TODO_ID=?", arrayOf(todoId.toString()))
db.delete(TABLE_TODO,"$COL_ID=?", arrayOf(todoId.toString()))
}
这是我正在使用的 recyclerview 适配器:
class ItemAdapter(val context: Context,val dbHandler: DBHandler, val list: MutableList<ToDoItem>) :
RecyclerView.Adapter<ItemAdapter.ViewHolder>(){
override fun onCreateViewHolder(p0: ViewGroup, p1: Int): ViewHolder {
return ViewHolder(LayoutInflater.from(context).inflate(R.layout.rv_child_item,p0,false))
}
override fun onBindViewHolder(holder: ViewHolder, p1: Int) {
holder.itemName.text = list[p1].itemName
holder.itemName.isChecked = list[p1].isCompleted
holder.itemName.setOnClickListener{
list[p1].isCompleted = !list[p1].isCompleted
dbHandler.updateToDoItem(list[p1])
}
}
override fun getItemCount(): Int {
return list.size
}
class ViewHolder(v : View) : RecyclerView.ViewHolder(v){
val itemName : CheckBox = v.findViewById(R.id.cb_item)
}
}
但由于某种原因,当我尝试在此 Swipetodelete 对象中调用删除函数时,我无法使其工作:
val item = object : SwipeToDelete(this,0,ItemTouchHelper.LEFT){
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
}
}
我也想添加编辑功能,但如果我能让这个删除功能工作,我可以添加它。
解决方案
由于 SwipeToDelete 是一个抽象类,您可以在 Fragment/Activity 类上覆盖 onSwiped 函数。
您可以将 SwipeToDelete 类修改为:
abstract class SwipeToDelete(context: Context, dragDir: Int, swipeDir: Int): ItemTouchHelper.SimpleCallback(dragDir, swipeDir) {
override fun onMove(
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
target: RecyclerView.ViewHolder
): Boolean {
return false
}
}
然后覆盖片段/活动中的 onSwiped 函数并将其附加到您的回收站视图:
val item = object : SwipeToDelete(this,0,ItemTouchHelper.LEFT){
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
deleteToDo(todoId)
}
}
ItemTouchHelper(item).attachToRecyclerView(recycler)
推荐阅读
- c++ - 在树数据结构上实现互斥锁的最佳方法是什么?
- javascript - Ngx引导日期选择器的最大类型数?
- sql - 从字符串转换日期和/或时间时出现转换失败错误
- python - 求解具有巨大矩阵的线性方程组的最快方法
- macos - 在 MacOS 上无法 ssh 到 22 以外的本地主机端口
- python - 单元格中具有多个值的表格的计数/透视
- python - 使用 Python 从 JSON 文件中选择数据
- javascript - 用于工作表的 Google 脚本不复制单元格内的公式,仅复制值
- c# - Selenium-Nunit 如何等待几个图像
- sparql - 元素转换 Apache Jena