Мне нужно реализовать функцию редактирования расписания через недели и дни.В приложении каждый день графика 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
.
Есть ли более элегантный способ редактирования фрагментов?