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

时间:2018-11-02 17:57:11

标签: android android-recyclerview kotlin

让我们在开始时定义一个变量,它会更容易阅读:
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))
    }

您有任何想法如何编写此代码?

1 个答案:

答案 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()