如何从 recyclerView 和 sqlite 数据库中删除 cardview?(科特林 - 安卓)

阿里·阿尔梅斯巴

我正在创建一个带有回收站视图、卡片视图和 SQLite 数据库的应用程序。卡片视图包含标题、描述和删除图标(在项目单击时)。当用户在卡片视图中输入一些数据时,它会显示在回收器视图中并添加到数据库中。

我想要什么:当我单击卡片视图中的删除图标时,我想同时从数据库和回收站视图中删除所需的卡片视图。

问题:假设我添加了 3 个卡片视图,当我单击其中一个的删除图标时它会消失,但最后添加的卡片视图的副本出现在底部,因此卡片视图的数量保持不变( 3 张卡片)请检查下面的图片。

回收者视图适配器的代码:

class BillsAdapter(val bills: List<Bill>) : RecyclerView.Adapter<BillsAdapter.BillViewHolder>() {

private var mListener: OnItemClickListener? = null

interface OnItemClickListener {
    fun onDeleteClick(position: Int)
}

fun setOnClickListener(listener: OnItemClickListener) {
    mListener = listener
}

class BillViewHolder( val card: View, listener: OnItemClickListener?) : RecyclerView.ViewHolder(card) {
    var mDeleteImage: ImageView

    init {
        mDeleteImage = card.findViewById(R.id.btn_delete)

        mDeleteImage.setOnClickListener {
            if (listener != null) {
                val position = adapterPosition
                if (position != RecyclerView.NO_POSITION) {
                    listener.onDeleteClick(position)
                }
            }
        }
    }
}

override fun onBindViewHolder(holder: BillViewHolder, index: Int) {

    val bill = bills[index]

    holder.card.tv_title.text = bill.title
    holder.card.tv_description.text = bill.description


}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BillViewHolder {

    val view = LayoutInflater.from(parent.context).inflate(R.layout.single_card, parent, false)

    return BillViewHolder(view, mListener)
}

override fun getItemCount(): Int = bills.size 

数据库处理程序代码:

class billDbHandler (context: Context) : SQLiteOpenHelper(context,
DATABASE_NAME, null, DATABASE_VERSION) {

private val SQL_CREATE_ENTRIES = "CREATE TABLE ${BillEntry.TABLE_NAME} (" +
        "${BillEntry._ID} INTEGER PRIMARY KEY," +
        "${BillEntry.TITLE_COL} TEXT," +
        "${BillEntry.DESCR_COL} TEXT," +
        ")"

private val SQL_DELETE_ENTRIES = "DROP TABLE IF EXISTS ${BillEntry.TABLE_NAME}"

override fun onCreate(db: SQLiteDatabase) {
    db.execSQL(SQL_CREATE_ENTRIES)
}

override fun onUpgrade(db: SQLiteDatabase, oldVersion: Int, newVersion: Int) {
    db.execSQL(SQL_DELETE_ENTRIES)
    onCreate(db)
}

}

数据库表代码:

class BillDbTable(context: Context) {

private val TAG = BillDbTable::class.java.simpleName
private val dbHelper = billDbHandler(context)

fun store(bill: Bill): Long {
    val db  = dbHelper.writableDatabase
    val values = ContentValues()

    values.put(BillEntry.TITLE_COL, bill.title)
    values.put(BillEntry.DESCR_COL, bill.description)

    val id = db.insert(BillEntry.TABLE_NAME, null,values)

    db.close()

    Log.d(TAG, "Stored new bill to DB $bill")

    return id
}

fun readAllBills(): List<Bill> {
    val columns = arrayOf(BillEntry._ID,
        BillEntry.TITLE_COL, BillEntry.DESCR_COL)

    val order = "${BillEntry._ID} ASC"

    val db= dbHelper.readableDatabase

    val cursor = db.doQuery(BillEntry.TABLE_NAME, columns, orderBy = order)

    return  parseBillsFrom(cursor)

}

fun parseBillsFrom(cursor: Cursor): MutableList<Bill> {
    val bills = mutableListOf<Bill>()
    while (cursor.moveToNext()) {
        val title = cursor.getString(BillEntry.TITLE_COL)
        val desc = cursor.getString(BillEntry.DESCR_COL)

        bills.add(Bill(title, desc))
    }
    cursor.close()

    return bills
}

fun delete() {

    val columns = arrayOf(BillEntry._ID,
        BillEntry.TITLE_COL, BillEntry.DESCR_COL)

    val order = "${BillEntry._ID} ASC"

    val db = dbHelper.writableDatabase
    val cursor = db.doQuery(BillEntry.TABLE_NAME, columns, orderBy = order)

    if (cursor.moveToNext()){
        val id = cursor.getLong(0)
        db.delete(BillEntry.TABLE_NAME, BillEntry._ID + "= ?" , arrayOf(id.toString()))
        cursor.close()
     }

    db.close()
  } }    fun SQLiteDatabase.doQuery(table: String, columns: Array<String>, selection: String? = null,
                               selectionArgs: Array<String>? = null, groupBy: String? = null,
                               having: String? = null, orderBy: String? = null): Cursor {
return query(table, columns, selection, selectionArgs, groupBy, having, orderBy)}    private fun Cursor.getString(columnName: String): String = this.getString(getColumnIndex(columnName))

主要活动代码:

class MainActivity : AppCompatActivity() {

var db = BillDbTable(this)
private var mAdapter: BillsAdapter? = null

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    mAdapter = BillsAdapter(db.readAllBills())

    rv.setHasFixedSize(true)

    rv.layoutManager = LinearLayoutManager(this)
    rv.adapter = mAdapter

    mAdapter!!.setOnClickListener(object : BillsAdapter.OnItemClickListener {
        override fun onDeleteClick(position: Int) {
            removeCard(position)

        }
    })
}

override fun onCreateOptionsMenu(menu: Menu): Boolean {
    menuInflater.inflate(R.menu.main_menu, menu)
    return true
}

override fun onOptionsItemSelected(item: MenuItem): Boolean {
    if (item.itemId == R.id.add_bill){
        val intent = Intent(this, CreateBillActivity::class.java)
        startActivity(intent)
    }
    return true
}

fun test() {
    Toast.makeText(this, "Item Deleted", Toast.LENGTH_LONG).show()
}

fun removeCard(position: Int){

    db.delete()
    test()
    mAdapter!!.notifyItemRemoved(position)


} }

点击所有卡片的删除图标前

在此处输入图片说明

点击所有卡片的删除图标后 在此处输入图片说明

安德烈·阿图斯

有几种可能的策略,这里有两个:

  • 您需要从数据库重新加载列表,跟踪差异,或者
  • 您需要通过在bills从数据库中删除时从中删除项目来管理存储的项目列表(例如)。

您设置适配器的方式是初始化调用者拥有项目列表。适配器修改传递给它的列表通常不是一个好主意,您需要复制到可变集合或重新加载。

在进行移除更改后您还需要在适配器上调用notifyItemRemovednotifyItemRangeRemovednotifyDataSetChanged(取决于您实施移除的方式)。

您可能还想查看DiffUtil

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何从 RecyclerView 中删除或移除 CardView?安卓工作室

来自分类Dev

如何将用户添加和删除的项目保存到RecyclerView?安卓

来自分类Dev

如何在片段中更新SQLite数据库?安卓

来自分类Dev

安卓-Kitkat中的RecyclerView

来自分类Dev

如何在 GridView 中使用 Glide?(安卓/科特林)

来自分类Dev

如何从 ListView 和 SQLite 数据库中删除项目?

来自分类Dev

从科特林RecyclerView(cardview)的onclick加载详细视图

来自分类Dev

如何显示文字和按钮?(安卓)

来自分类Dev

如何让greenDAO在sdcard上创建数据库?- 安卓

来自分类Dev

SQLite数据库中的项目未在RecyclerView中删除

来自分类Dev

SQLite数据库中的项目未在RecyclerView中删除

来自分类Dev

安卓:创建Recyclerview

来自分类Dev

如何从位于我计算机上的数据库中获取数据。安卓

来自分类Dev

如何从声音中播放数组?- 安卓

来自分类Dev

安卓 单击RecyclerView中的项目时加载意图

来自分类Dev

如何添加Java库到本地科特林

来自分类Dev

如何从Android项目中删除科特林支持?

来自分类Dev

安卓 Sqlite。删除所有非数字

来自分类Dev

从RecyclerView和Realm数据库中删除项目

来自分类Dev

我如何从数据库中删除recyclerView中的项目

来自分类Dev

如何从Xamarin中的SQLite数据库删除数据

来自分类Dev

如何使用RxJava从数据库将数据加载到RecyclerView中?(MVP + RxJava + SQLite)

来自分类Dev

如何结合监听类和视图类?| 安卓

来自分类Dev

如何使用 Chaquopy 和 openCV 打开安卓相机?

来自分类Dev

Android:在RecyclerView Adapter中,如何测试SQLite数据库中的条目是否为null?

来自分类Dev

安卓 如何从Espresso测试库中滑动NavigationDrawer?

来自分类Dev

Android的科特林:如何异步调用后更新recyclerView?越来越CalledFromWrongThreadException

来自分类Dev

如何将代表类对象的RecyclerView项与此类对象绑定?科特林

来自分类Dev

如何将 Long 和 Int 与 assertEquals 进行比较。朱尼特·科特林

Related 相关文章

  1. 1

    如何从 RecyclerView 中删除或移除 CardView?安卓工作室

  2. 2

    如何将用户添加和删除的项目保存到RecyclerView?安卓

  3. 3

    如何在片段中更新SQLite数据库?安卓

  4. 4

    安卓-Kitkat中的RecyclerView

  5. 5

    如何在 GridView 中使用 Glide?(安卓/科特林)

  6. 6

    如何从 ListView 和 SQLite 数据库中删除项目?

  7. 7

    从科特林RecyclerView(cardview)的onclick加载详细视图

  8. 8

    如何显示文字和按钮?(安卓)

  9. 9

    如何让greenDAO在sdcard上创建数据库?- 安卓

  10. 10

    SQLite数据库中的项目未在RecyclerView中删除

  11. 11

    SQLite数据库中的项目未在RecyclerView中删除

  12. 12

    安卓:创建Recyclerview

  13. 13

    如何从位于我计算机上的数据库中获取数据。安卓

  14. 14

    如何从声音中播放数组?- 安卓

  15. 15

    安卓 单击RecyclerView中的项目时加载意图

  16. 16

    如何添加Java库到本地科特林

  17. 17

    如何从Android项目中删除科特林支持?

  18. 18

    安卓 Sqlite。删除所有非数字

  19. 19

    从RecyclerView和Realm数据库中删除项目

  20. 20

    我如何从数据库中删除recyclerView中的项目

  21. 21

    如何从Xamarin中的SQLite数据库删除数据

  22. 22

    如何使用RxJava从数据库将数据加载到RecyclerView中?(MVP + RxJava + SQLite)

  23. 23

    如何结合监听类和视图类?| 安卓

  24. 24

    如何使用 Chaquopy 和 openCV 打开安卓相机?

  25. 25

    Android:在RecyclerView Adapter中,如何测试SQLite数据库中的条目是否为null?

  26. 26

    安卓 如何从Espresso测试库中滑动NavigationDrawer?

  27. 27

    Android的科特林:如何异步调用后更新recyclerView?越来越CalledFromWrongThreadException

  28. 28

    如何将代表类对象的RecyclerView项与此类对象绑定?科特林

  29. 29

    如何将 Long 和 Int 与 assertEquals 进行比较。朱尼特·科特林

热门标签

归档