Как оптимально хранить данные редактора? - PullRequest
0 голосов
/ 20 апреля 2019

Мне нужно реализовать функцию редактирования расписания через недели и дни.В приложении каждый день графика Fragment внутри ViewPager.Сейчас я пытаюсь сохранить выбранные элементы на хосте Activity в специальном классе:

class LessonEditor {

    var mode: Mode = Mode.NONE
        private set(value) {
            field = value
            callbacks.forEach(fun(item: Callback) {
                item.onChangeEditMode(value)
            })
        }
    private var callbacks: MutableList<Callback> = mutableListOf()
    private var editList: MutableList<Int>? = null
    private var createList: MutableList<CreateItem>? = null

    fun create() {
        editList = mutableListOf()
        createList = mutableListOf()
        callbacks.forEach(fun(item: Callback) {
            item.onCreateEditor()
        })
    }

    fun destroy() {
        callbacks.forEach(fun(item: Callback) {
            item.onDestroyEditor()
        })
        editList?.clear()
        createList?.clear()
        editList = null
        createList = null
        mode = Mode.NONE
    }

    fun add(id: Int): Boolean {

        when (mode) {
            Mode.CREATE -> return false
            Mode.NONE -> mode = Mode.EDIT_ONE
            Mode.EDIT_ONE -> mode = Mode.EDIT_FEW
            else -> {}
        }

        return editList?.add(id)?: false
    }

    fun subscribe(callback: Callback) {
        callbacks.add(callback)
    }

    fun unsubscribe(callback: Callback) {
        callbacks.remove(callback)
    }

    fun add(week: Int, day: Day, order: Int): Boolean {

        if (Mode.EDIT_ONE == mode || Mode.EDIT_FEW == mode) {
            return false
        }

        if (Mode.NONE == mode) {
            mode = Mode.CREATE
        }

        return createList?.add(CreateItem(week, day, order))?: false
    }

    fun remove(id: Int) {

        if (Mode.NONE == mode || Mode.CREATE == mode) {
            return
        }

        if (editList?.remove(id) == true) {

            if (editList?.isEmpty() == true) {
                mode = Mode.NONE
            } else if (1 == editList?.size) {
                mode = Mode.EDIT_ONE
            }
        }
    }

    fun remove(week: Int, day: Day, order: Int) {

        if (Mode.CREATE != mode) {
            return
        }

        if (createList?.remove(CreateItem(week,day, order)) == true &&
                createList?.isEmpty() == true) {
            mode = Mode.NONE
        }
    }

    data class CreateItem(var week: Int, var day: Day, var order: Int)

    enum class Mode {
        NONE, CREATE, EDIT_ONE, EDIT_FEW
    }

    interface Callback {
        fun onCreateEditor()
        fun onDestroyEditor()
        fun onChangeEditMode(mode: Mode)
    }
}

Это черновая модель.Основная идея заключается в том, что основной вид деятельности контролирует жизненный цикл LessonEditor, и Fragment s могут подписываться и отписываться от этого редактора, реализующего LessonEditor.Callback.Но мое решение не удобно из-за необходимости дублирования данных, поскольку Fragment s необходимо сохранять данные адаптеров в savedInstanceState, и когда пользователь снова выберет этот фрагмент, ему нужно будет синхронизировать состояние с LessonEditor.

Есть ли более элегантный способ редактирования фрагментов?

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