Уведомить активность от адаптера, когда элемент удален (emptyView) - PullRequest
0 голосов
/ 02 ноября 2018

Давайте определим одну переменную в начале, будет легче читать:
столбец 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))
    }

У вас есть идеи, как мне написать этот код?

1 Ответ

0 голосов
/ 02 ноября 2018

Вам нужен обратный вызов. Когда вы удаляете какой-либо элемент, проверьте, является ли он последним, и если это правда, то позвоните.

Добавьте этот интерфейс на свой адаптер:

interface OnListIsEmpty{
    fun onListIsEmpty()
}

И создайте объект этой глобальной переменной в вашем адаптере:

private var mOnListIsEmpty: OnListIsEmpty? = null

Добавить метод установки:

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

И в вашем методе удаления выполните проверку, если она пуста, если она истинна, то:

    mOnListIsEmpty?.onListIsEmpty()

И не забудьте установить обратный вызов при инициализации адаптера с помощью:

adapter.setOnListIsEmpty(object : OnListIsEmpty{
        override fun onListIsEmpty() {
            //your action
        }
    })
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...