我正在应用程序中做一个测验问卷。有前进和后退两个按钮。我展示了一系列问题。先决条件是能够显示最后 5 个已回答的问题。所有问题(包括已回答的问题)、所有答案(如果有)都来自服务器。收到所有内容后,我过滤未回答的问题并将它们添加到数组中。我还将最后 5 个问题的答案放在一个单独的数组中。现在它的工作原理是这样的——在接收、过滤之后,我显示第一个未回答的问题,而显示上一个问题的按钮处于活动状态,而显示下一个问题的按钮处于非活动状态(还没有答案)。我现在可以单击返回查看 5 个已回答的问题及其答案选项。我可以从数组的开头走到结尾,然后后退按钮变为非活动状态,直到按下前进按钮。问题的本质是,只有当我使用后退按钮转到最后一个回答的问题时,我才能正常浏览问题,例如,如果我想查看第一个回答的问题,然后返回第一个未回答的问题,然后我将不得不单击“转发”按钮两次。下面是处理按钮点击的代码:
updateAdapter(0, questionsIndex, answersOptions, 1, ArrayList<Int>())
questionsIndex += 1
next_question.setOnClickListener {
if (questionsIndex != questionType1.lastIndex) {
if (userAnswerId != null) {
Singleton.apiService().sendAnswer("Bearer " + context!!.getSharedPreferences("app_data", 0).getString("access_token", "")!!, OutAnswerModel(questionType1[questionsIndex - 1].id!!, userAnswerId!!))
.enqueue(object : Callback<OutAnswerModel> {
override fun onResponse(call: Call<OutAnswerModel>, response: Response<OutAnswerModel>) {
if (response.isSuccessful) {
lastAnswersArray.add(0, questionType1[questionsIndex - 1])
userAnswers.add(0, userAnswerId!!)
userAnswerId = null
userAnswers.removeAt(userAnswers.lastIndex)
lastAnswersArray.removeAt(lastAnswersArray.lastIndex)
updateAdapter(0, questionsIndex, answersOptions, 1, ArrayList<Int>())
questionsIndex += 1
}
}
override fun onFailure(call: Call<OutAnswerModel>, t: Throwable) {
}
})
} else if (answerIndex in -1..4) {
when {
answerIndex >= 0 -> {
updateAdapter(1, answerIndex, answersOptions, 2, userAnswers[answerIndex])
}
answerIndex < 0 -> {
answerIndex = 0
updateAdapter(0, questionsIndex - 1, answersOptions, 1, ArrayList<Int>())
}
}
answerIndex -= 1
prev_question.isEnabled = true
}
} else {
workingWithViews(1)
textSetter(finalText!![0], finalText[1], finalText[2])
next.isEnabled = false
Handler().postDelayed({
next.isEnabled = true
}, 1000)
}
}
if (lastAnswersArray.isNotEmpty()) {
prev_question.setOnClickListener {
updateAdapter(1, answerIndex, answersOptions, 2, userAnswers[answerIndex])
if (answerIndex != lastAnswersArray.lastIndex) {
answerIndex += 1
} else {
prev_question.isEnabled = false
}
}
} else {
answerIndex -= 1
prev_question.isEnabled = false
}
我的算法很可能在某个地方失败了,但我无法确切知道在哪里以及如何修复它。它似乎考虑了一切,但它并没有按应有的方式工作。也许解释不是很清楚,所以如果有人不明白,请询问。
UPD
算法的问题似乎可以定位。当我点击后退按钮时,我将响应索引增加 1:
if (answerIndex != lastAnswersArray.lastIndex) {
answerIndex += 1 // тут
} else {
prev_question.isEnabled = false
}
然后我按下“前进”按钮并将索引减 1:
else if (answerIndex in -1..4) {
answerIndex -= 1 // тут
when {
answerIndex >= 0 -> {
updateAdapter(1, answerIndex, answersOptions, 2, userAnswers[answerIndex])
}
answerIndex < 0 -> {
answerIndex = 0
updateAdapter(0, questionsIndex - 1, answersOptions, 1, ArrayList<Int>())
}}
prev_question.isEnabled = true
}
事实证明,当我们点击“后退”时,我们增加了索引,当我们点击“前进”时,我们减少了它,结果,我们需要按下它两次,以便索引减少到足以触发条件。还没想好怎么解决:(
事实证明一切都很简单。我堆积了一堆数组和一堆索引,最终让我感到困惑。我最后做了什么:一个数组和一个索引。在数组的开头将有 5 个已回答的问题,然后是未回答的问题。导航也超简单,后退键:
按钮“前进”,出现错误的片段:
现在 index 不是从 0 开始而是从 5 开始,即会显示第一个未回答的问题。此外,我希望代码中的一切都很清楚。没有必要围栏和建造任何东西,一切都比一开始更简单,更清晰。如果有人有任何问题或建议 - 询问/建议 :)