Как обновить Recyclerview в режиме реального времени, когда документ удален из магазина? - PullRequest
0 голосов
/ 24 сентября 2018

Я хочу обновить Recyclerview в режиме реального времени, когда документ добавляется или удаляется из магазина.Я использую эту логику в Kotlin:

        for (doc in docs!!.documentChanges) {
            val classElement: FireClassModel=doc.document.toObject(FireClassModel::class.java)

            if (doc.type == DocumentChange.Type.ADDED) {
                adapterList.add(classElement)

            } else if(doc.type == DocumentChange.Type.REMOVED){
                adapterList.remove(classElement)
            }
            adapter.notifyDataSetChanged()
        }

Работает нормально при добавлении документа, но не работает при удалении данных.В нем нет ошибок, но он не обновляется в режиме реального времени.Оно обновляется только после перезапуска приложения.

Обновлено

FireClassModel:

class FireClassModel {

    var classID: String = ""
    var className: String = ""


}

Я пробовал это classesList.contains(classElement) и он возвращает ложь.Это означает, что я не могу сравнивать объекты в моем ArrayList.

Ответы [ 2 ]

0 голосов
/ 25 сентября 2018

Наконец-то я решил проблему.Проблема была в том, что я не получаю нужный объект.

Я просто заменил adapterList.remove(classElement) на следующее:

            for (cls in adapterList) {
                if (cls.classID == doc.document.id) {
                    adapterList.remove(cls)
                }
            }

Благодаря @ Markus

0 голосов
/ 25 сентября 2018

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

adapterList.remove(classElement)

При удалении элемента из списка с помощью remove(o: Object): Boolean первый соответствующий элемент из списка будет удален.Соответствующий элемент - это элемент, в котором метод equals возвращает true.

listElement == elementToRemove // Kotlin
listElement.equals(elementToRemove); // Java

По умолчанию (это означает, что если вы не переопределите equals), объекты будут равны, только если они совместно используютто же место в памяти.В вашем примере элемент в списке находится в другом месте, чем элемент, который вы создаете из Firestore в вашем слушателе изменения документа.

Решение зависит от вашего FireClassModel.Глядя на несколько FireClassModel объектов, как бы вы решили, какие из них равны?Может быть, они будут иметь одинаковый идентификатор?Затем переопределите метод equals (и для каждого контракта также hashCode) и сравните поля, которые делают два объекта идентичными.Для идентификатора решение может выглядеть так (генерируется Android Studio):

class FireClassModel(val id: Int) {

    override fun equals(other: Any?): Boolean {
        if (this === other) return true
        if (javaClass != other?.javaClass) return false

        other as FireClassModel

        if (id != other.id) return false

        return true
    }

    override fun hashCode(): Int {
        return id
    }
}

После этого сравнение двух FireClassModel объектов с одинаковым идентификатором вернет true.Без переопределения метода equals это было бы не так (если вы не сравниваете объект с самим собой).

Подробнее о equals можно найти в Stackoverflow и в Java документация .

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