Я создаю приложение с представлением переработчика, представлением карты и базой данных 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](https://i.stack.imgur.com/EA8fC.png)
После нажатия иконки удаления всех карточек
![enter image description here](https://i.stack.imgur.com/lXgCe.png)