Kotlin смотреть изменение массива - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь получить уведомление, когда массив меняет свое содержимое. С помощью этого кода я могу уведомить настройку массива, но ничего не происходит, когда вставляется новый элемент.

var array: MutableMap<String, List<String>> = mutableMapOf()
    set(value) {
        field = value
        arrayListener?.notify()
    }

Единственное, что я придумал, - это сброс массива к себе каждый раз, когда я добавляю, удаляю или редактирую элементы, как это:

array = array

Я прочитал этот вопрос Как следить за изменениями в массивах? относительно Javascript, но я бы хотел более простое решение, чем создание нового объекта, может кто-нибудь предложить это?

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

API массива довольно прост: элементы могут быть записаны туда и могут быть прочитаны из массива.

При 99% (число без обоснования, читайте "подавляющее большинство") пользователей массива удовлетворены этим простым API. Было бы стыдно, если бы простой интерфейс с простой реализацией смешивался с хитрой функциональностью.

Переходя к вашей проблеме, возможный подход может заключаться в создании оболочки-массива

class ArrayWrapper<T> (private val array: Array<out T>, 
                       private val onChange: () -> Unit) {
    val size = array.size

    fun get(index: Int): T {
        return array[index]
    }

    fun set(index: Int, value: T) {
        array[index] = value
        onChange()
    }
}

Пример использования:

val ints = ArrayWrapper(arrayOf(1, 2, 3)) {
    println("Array has been changed")
}
0 голосов
/ 29 августа 2018

В настоящее время вы наблюдаете только, что новой карте назначена переменная array. Ваш код не будет уведомлять вас, если запись карты будет добавлена ​​или удалена с карты.

Если вы хотите наблюдать за переназначением array, вы можете использовать наблюдаемый делегат из стандартной библиотеки Kotlin.

Примечание. Переименуйте переменную array так, чтобы она соответствовала используемой вами структуре данных.

Вот пример:

 var map:  MutableMap<String, List<String>> by Delegates.observable(mutableMapOf()) {
    property, oldValue, newValue ->  
    if (oldValue != newValue) //notify that reference has changed
 }

Вы можете прочитать о наблюдаемом делегате здесь .

Поскольку вы хотите наблюдать изменения на карте, я думаю, вам следует взглянуть на этот вопрос . Это может помочь. Чтобы заархивировать то, что вы хотите, вам придется расширить карту или создать обертку вокруг нее, которая будет уведомлять вас о добавлении или удалении записи карты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...