Невозможно обновить класс pojo в Kotlin - PullRequest
0 голосов
/ 26 апреля 2019

Я пытаюсь обновить мой класс pojo для конкретного клика в Kotlin, но он выдает мне ошибку: -

java.lang.stackoverflowerror: размер стека 8 МБ

Вот мой класс Pojo

class NavDrawerItem(var icon_normal: Int,var icon_notified: Int, var title: String, var isShowNotify: Boolean){
    var title1: String = title
        //  get() = title                    // Calls the getter recursively
        set(value)
        { title1 = value }

    var image: Int = icon_normal
        // get() = image
        set(value)
        { image = value }

    var image_notified: Int = icon_notified
        // get() = image
        set(value)
        { image_notified = value }


    var notify: Boolean = isShowNotify
        set(value) {
            notify = value
        }
}

Я обновляю свое Pojo при щелчке элемента NavigationDrawer

override fun onItemClick(position: Int) {
        mDrawerLayout?.closeDrawer(this!!.containerView!!)
        position1 = position
        for (i in navDrawerItems.indices) {
            val item = navDrawerItems[i]
            item.notify=(if (i == position) true else false)
            navDrawerItems[i] = item
            mAdapter?.notifyDataSetChanged()
        }
    }

Пожалуйста, помогите мне !!!!

Ответы [ 3 ]

1 голос
/ 26 апреля 2019

Измените свой класс как простой класс данных .

data class NavDrawerItem(var icon_normal: Int,var icon_notified: Int, var title: String, var isShowNotify: Boolean)

А

override fun onItemClick(position: Int) {
    mDrawerLayout?.closeDrawer(this!!.containerView!!)
    for (i in navDrawerItems.indices) {
        val item = navDrawerItems[i]
        item.notify=(i == position)
    }
    mAdapter?.notifyDataSetChanged()
}
1 голос
/ 26 апреля 2019

Ваши сеттеры создают бесконечный цикл, который вызывает исключения StackOverflowError.

class NavDrawerItem(var icon_normal: Int,var icon_notified: Int, var title: String, var isShowNotify: Boolean){
    var title1: String = title
        //  get() = title                    // Calls the getter recursively
        set(value)
        { field = value }

    var image: Int = icon_normal
        // get() = image
        set(value)
        { field = value }

    var image_notified: Int = icon_notified
        // get() = image
        set(value)
        { field = value }


    var notify: Boolean = isShowNotify
        set(value) {
            field = value
        }
}

Выше указано, как установить поле, в котором ваша реализация рекурсивно устанавливает значения.

Также,как упомянул ADM, лучше перемещать notifyDataSetChanged вне цикла и не обновлять его на каждой итерации.

0 голосов
/ 26 апреля 2019

Всегда рекомендуется использовать классы данных для определения pojos.Потому что классы данных предназначены только для хранения данных.
Они предоставляют множество уникальных функций по сравнению с обычным классом в kotlin.
Например, вам не нужно определять сеттер и геттер, они автоматически добавляются в ваш класс данных.
Кроме того, ваш класс данных автоматически переопределит некоторые полезные функции, такие как равно , hashCode , toString и т. Д.

определить класс данных очень просто.

data class Foo ( val title : String, val isHungry : Boolean ){

}
...