Давайте определим одну переменную в начале, будет легче читать:
столбец sqlite3 KEY_TITLE
= A
У меня активность в проводимости с курсором-загрузчиком. Когда в столбце A
нет строк, я хочу, чтобы активность отображала emptyView. Для этого я создал метод, который проверяет все строки в столбце A
, есть ли в нем какие-либо данные.
fun hideLayout(){
val isEmpty = emptyViewObserver(applicationContext).isEmpty()
if (isEmpty) {
recyclerView.visibility = View.GONE
emptyView.visibility = View.VISIBLE
} else {
recyclerView.visibility = View.VISIBLE
emptyView.visibility = View.GONE
}
}
класс emptyViewObserver
с isEmpty
метод:
class emptyViewObserver(val context: Context){
fun isEmpty():Boolean{
val db = WalletDbHelper(context).readableDatabase
val projection = arrayOf(KEY_TITLE)
val cursor = db.query(
WalletEntry.TABLE_NAME,
projection,
null,
null,
null,
null,
null
)
val names = mutableListOf<String>()
with(cursor){
while (moveToNext()){
val name = getString(cursor.getColumnIndexOrThrow(WalletEntry.KEY_TITLE))
names.add(name)
}
}
db.close()
return names.isEmpty()
}
}
Всякий раз, когда я выполняю какую-либо операцию CRUD в MainActivity
классе, я вызываю hideLayout
метод, чтобы проверить, должен ли показываться emptyView или нет. Работает нормально. Но я столкнулся с проблемой после выполнения операции удаления из моего адаптера для вызова метода hideLayout()
. По понятным причинам он вызывает ошибку при вызове напрямую из адаптера, поэтому я решил реализовать интерфейс и переопределить его в MainActivity
. Я прочитал несколько уроков, но я так и не понял, как правильно это реализовать.
Это мой метод удаления из адаптера:
holder.delete.setOnClickListener { v ->
val popup = PopupMenu(context, v)
val inflater = popup.menuInflater
inflater.inflate(R.menu.delete, popup.menu)
popup.show()
popup.setOnMenuItemClickListener { v ->
when(v.itemId) {
R.id.delete -> {
delete(uri, walletName)
true
}
else -> {
false
}
}
}
}
и delete ():
fun delete(uri: String, walletName: String){
val newUri: Uri = Uri.parse(uri)
context.contentResolver.delete(newUri, WalletEntry.KEY_TITLE, arrayOf(walletName))
}
У вас есть идеи, как мне написать этот код?