You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
232 lines
6.0 KiB
232 lines
6.0 KiB
package com.gyf.csams.association.model
|
|
|
|
import android.app.Application
|
|
import androidx.lifecycle.LiveData
|
|
import androidx.lifecycle.MutableLiveData
|
|
import androidx.lifecycle.viewModelScope
|
|
import com.gyf.lib.model.ScrollViewModel
|
|
import com.gyf.lib.uikit.StringForm
|
|
import com.gyf.lib.util.*
|
|
import kotlinx.coroutines.launch
|
|
import kotlin.random.Random
|
|
|
|
/**
|
|
* 题库界面类型
|
|
*
|
|
*/
|
|
enum class ExamActivityType(val menuName: String) {
|
|
//入团题库
|
|
SET_EXAM("入团题库"),
|
|
|
|
//入团申请表
|
|
JOIN_Association("入团申请表")
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
* 问题长度
|
|
*/
|
|
const val QUESTION_TEXT_LENGTH = 30
|
|
|
|
/**
|
|
* 选择题选项数
|
|
*/
|
|
const val ANSWER_SIZE = 4
|
|
|
|
/**
|
|
* 答案长度
|
|
*
|
|
*/
|
|
const val ANSWER_TEXT_LENGTH = 15
|
|
|
|
|
|
/**
|
|
* 题库状态管理
|
|
*
|
|
*/
|
|
|
|
class ExamViewModel(application: Application) : ScrollViewModel<Exam>(application) {
|
|
val questionIsNull: String = "问题不能为空"
|
|
val deleteLeastOne: String = "至少保留一道题目"
|
|
val deleteTip = "确定删除此题目?"
|
|
val addTip = "确定添加此题目?"
|
|
val actionLabel = "确定"
|
|
|
|
|
|
override val initSize = 10
|
|
|
|
|
|
private val _newExam: MutableLiveData<Exam> = MutableLiveData(createExam(ExamType.CQ))
|
|
val newExam: LiveData<Exam> = _newExam
|
|
|
|
init {
|
|
load()
|
|
}
|
|
|
|
/**
|
|
* 切换题型
|
|
*
|
|
*/
|
|
fun switchType(exam: Exam) {
|
|
if (exam is ChoiceQuestionVo) _newExam.value = createExam(ExamType.OQ) else _newExam.value =
|
|
createExam(ExamType.CQ)
|
|
}
|
|
|
|
|
|
/**
|
|
* 创建题目
|
|
*
|
|
* @param type
|
|
* @return
|
|
*/
|
|
private fun createExam(type: ExamType): Exam {
|
|
val question = StringForm(formDesc = "问题", textLength = QUESTION_TEXT_LENGTH)
|
|
return when (type) {
|
|
ExamType.CQ -> ChoiceQuestionVo(
|
|
answers = ('A'..'D').map {
|
|
StringForm(
|
|
formDesc = "选项",
|
|
textLength = ANSWER_TEXT_LENGTH,
|
|
value = "选项$it"
|
|
)
|
|
},
|
|
rightAnswer = 0,
|
|
question = question
|
|
)
|
|
ExamType.OQ -> OpenQuestionsVo(question = question)
|
|
}
|
|
}
|
|
|
|
|
|
/**
|
|
* 更新题目
|
|
*
|
|
*/
|
|
fun update(oldExam: Exam, newExam: Exam) {
|
|
if (oldExam == _newExam.value) {
|
|
_newExam.value = newExam
|
|
} else {
|
|
_data.value?.apply {
|
|
this[indexOf(oldExam)] = newExam
|
|
val list = mutableListOf<Exam>()
|
|
list.addAll(this)
|
|
_data.value?.clear()
|
|
_data.value = list
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* TODO 更新题库
|
|
*
|
|
* @param callback
|
|
*/
|
|
fun updateExam(callback: (message: String) -> Unit) {
|
|
callback(NOT_IMPL_TIP)
|
|
}
|
|
|
|
/**
|
|
* TODO 提交答案
|
|
*
|
|
* @param callback
|
|
*/
|
|
fun postAnswer(callback: (message: String) -> Unit) {
|
|
callback(NOT_IMPL_TIP)
|
|
}
|
|
|
|
/**
|
|
* 加载题目
|
|
*
|
|
*/
|
|
fun load() {
|
|
viewModelScope.launch {
|
|
_data.value?.apply {
|
|
repeat(initSize) {
|
|
if (Random.nextBoolean()) {
|
|
add(
|
|
OpenQuestionsVo(
|
|
question = StringForm(
|
|
formDesc = "问题",
|
|
textLength = QUESTION_TEXT_LENGTH,
|
|
value = "这是一道开放题:$size"
|
|
)
|
|
)
|
|
)
|
|
} else {
|
|
add(
|
|
ChoiceQuestionVo(
|
|
question = StringForm(
|
|
formDesc = "问题",
|
|
textLength = QUESTION_TEXT_LENGTH,
|
|
value = "这是一道选择题:$size"
|
|
),
|
|
answers = ('A'..'D').map {
|
|
StringForm(
|
|
formDesc = "选项",
|
|
textLength = ANSWER_TEXT_LENGTH,
|
|
value = "选项$it"
|
|
)
|
|
},
|
|
rightAnswer = Random.nextInt(ANSWER_SIZE)
|
|
)
|
|
)
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
*TODO 加载更多题目
|
|
*
|
|
* @param callback
|
|
*/
|
|
fun loadMore(callback: (message: String) -> Unit) {
|
|
// _data.value?.apply {
|
|
// val list= mutableListOf<Exam>()
|
|
// list.addAll(this)
|
|
// list.apply {
|
|
// repeat(10) {
|
|
// if (Random.nextBoolean()) add(OpenQuestionsVo(question = "这是一道开放题:$size")) else add(
|
|
// ChoiceQuestionVo(
|
|
// question = "这是一道选择题:$size,请从选项中选出正确答案",
|
|
// answers = listOf("选项A", "选项B", "选项C", "选项D"),
|
|
// rightAnswer = 3
|
|
// )
|
|
// )
|
|
// }
|
|
// }
|
|
// _data.postValue(list)
|
|
// callback("成功加载更多题目")
|
|
// }
|
|
|
|
// callback(NOT_IMPL_TIP)
|
|
}
|
|
|
|
fun addQuestion() {
|
|
_data.value?.apply {
|
|
_newExam.value?.let {
|
|
val list = mutableListOf<Exam>()
|
|
list.addAll(this)
|
|
list.add(it)
|
|
_data.postValue(list)
|
|
}
|
|
_newExam.value = createExam(ExamType.CQ)
|
|
}
|
|
}
|
|
|
|
/**
|
|
* TODO 删除题目
|
|
*
|
|
*/
|
|
fun deleteQuestion(exam: Exam) {
|
|
_data.value?.apply {
|
|
val list = mutableListOf<Exam>()
|
|
remove(exam)
|
|
list.addAll(this)
|
|
_data.postValue(list)
|
|
}
|
|
}
|
|
} |