删除项时从适配器通知活动(emptyView)



让我们在开头定义一个变量,它将更容易阅读:
sqlite3 columnKEY_TITLE=A

我有活动正在与光标加载程序进行。当列A中没有行时,我希望活动显示一个空视图。为此,我创建了一个方法,检查列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
}
}

isEmpty方法分类emptyViewObserver

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()
}
}

每当我在MainActivity类中执行任何CRUD操作时,我都会调用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))
}

你知道我该怎么写这个代码吗?

您需要一个回调,当您删除某个项目时,检查是否是最后一个,如果是真的,请调用它。

在适配器上添加此接口:

interface OnListIsEmpty{
fun onListIsEmpty()
}

并在适配器中创建一个类似全局变量的对象:

private var mOnListIsEmpty: OnListIsEmpty? = null

添加setter方法:

fun setOnListIsEmpty(onListIsEmpty: OnListIsEmpty){
this.mOnListIsEmpty = onListIsEmpty
}

在您的删除方法中,如果为空,则进行验证如果为真,则:

mOnListIsEmpty?.onListIsEmpty()

不要忘记在初始化适配器时设置回调:

adapter.setOnListIsEmpty(object : OnListIsEmpty{
override fun onListIsEmpty() {
//your action
}
})

最新更新