让我们在开始时定义一个变量,它会更容易阅读:
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()
}
}
每当我在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))
}
您有任何想法如何编写此代码?
答案 0 :(得分:1)
您需要回调,在删除某些项目时,请检查是否为最后一个项目,是否为真。
在适配器上添加此接口:
SqlConnection conn = new SqlConnection(ConfigurationManager.
ConnectionStrings["connectionString"].ConnectionString);
string cartsql = "SELECT menu_name,menu_price,menu_quantity FROM cart where email=@email";
SqlCommand cmd1 = new SqlCommand(cartsql, conn);
cmd1.Parameters.AddWithValue("@email", Session["email"].ToString());
SqlDataAdapter sda = new SqlDataAdapter(cmd1);
DataTable dt = new DataTable();
sda.Fill(dt);
if (dt.Rows.Count > 0)
{
foreach (DataRow dtRow in dt.Rows)
{
string menuname = dtRow["menu_name"].ToString();
string menuprice = dtRow["menu_price"].ToString();
string menuquantity = dtRow["menu_quantity"].ToString();
}
}
并在适配器中也创建一个像全局变量这样的对象:
interface OnListIsEmpty{
fun onListIsEmpty()
}
添加setter方法:
private var mOnListIsEmpty: OnListIsEmpty? = null
然后在您的delete方法中进行验证(如果为true则为空):
fun setOnListIsEmpty(onListIsEmpty: OnListIsEmpty){
this.mOnListIsEmpty = onListIsEmpty
}
并且不要忘记在使用以下方法初始化适配器时设置回调:
mOnListIsEmpty?.onListIsEmpty()