Как удалить просмотр карты из recyclerView и базы данных sqlite? (Котлин - Android) - PullRequest
0 голосов
/ 10 ноября 2018

Я создаю приложение с представлением переработчика, представлением карты и базой данных 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)


} }

Перед нажатием иконки удаления всех карточек

enter image description here

После нажатия иконки удаления всех карточек enter image description here

1 Ответ

0 голосов
/ 10 ноября 2018

Есть несколько возможных стратегий, вот две:

  • Вам необходимо перезагрузить список из БД, отслеживать различия или
  • Вам необходимо управлять списком сохраненных элементов (например, bills), удаляя из него элементы по мере удаления из БД.

Способ настройки адаптера заключается в том, что инициализирующему абоненту принадлежит список элементов. Обычно адаптеру не рекомендуется изменять переданный ему список, вам нужно либо скопировать в изменяемую коллекцию, либо перезагрузить.

Вам также необходимо вызвать notifyItemRemoved , notifyItemRangeRemoved или notifyDataSetChanged (в зависимости от того, как вы выполняете удаление) на адаптере после внесения изменений в удаление.

Вы также можете посмотреть DiffUtil .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...