Как мне go перейти к последнему элементу в Kotlin списке с помощью предыдущей кнопки? - PullRequest
0 голосов
/ 15 января 2020

Я новичок в изучении Kotlin в Android Studio. Я работаю над приложением для викторины, в котором есть 20 вопросов, и я могу нажать рядом с последним вопросом, а затем вопросы начинаются с вопроса 1. Однако часть, с которой я борюсь, - это предыдущая кнопка. Каждая попытка приводит к сбою моего android приложения. Я поместил последний код, который я пробовал ниже. Заранее спасибо!

 private val questionBank = listOf(
    Question(R.string.question_1, false),
    Question(R.string.question_2, true),
    Question(R.string.question_3, true),
    Question(R.string.question_4, false),
    Question(R.string.question_5, false),
    Question(R.string.question_6, true),
    Question(R.string.question_7, false),
    Question(R.string.question_8, true),
    Question(R.string.question_9, false),
    Question(R.string.question_10, false),
    Question(R.string.question_11, false),
    Question(R.string.question_12, true),
    Question(R.string.question_13, false),
    Question(R.string.question_14, true),
    Question(R.string.question_15, false),
    Question(R.string.question_16, false),
    Question(R.string.question_17, true),
    Question(R.string.question_18, false),
    Question(R.string.question_19, false),
    Question(R.string.question_20, true))

private var questionIndex = 0


override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    findViewById<Button>(R.id.previous_button).setOnClickListener(){
        questionIndex = (questionIndex--)

       if (questionIndex > 0) {
            questionIndex--
            findViewById<TextView>(R.id.text_question).setText(questionBank[questionIndex].resourceID)
       }
        else {
           questionIndex = (questionIndex - 1) % 20
           findViewById<TextView>(R.id.text_question).setText(questionBank[questionIndex].resourceID)

       }
    }
    findViewById<Button>(R.id.next_button).setOnClickListener {
        updateView()
    }
}

private fun updateView() {
    questionIndex = (questionIndex + 1) % 20
    findViewById<TextView>(R.id.text_question).setText(questionBank[questionIndex].resourceID)

}

1 Ответ

1 голос
/ 15 января 2020

Как насчет моделирования вопросов в виде стека следующим образом:

data class Question(val resourceId: Int, val answer: Boolean)

val questions = listOf(
        Question(R.string.question_1, false),
        Question(R.string.question_2, true),
        Question(R.string.question_3, true),
        Question(R.string.question_4, false),
        Question(R.string.question_5, false),
        Question(R.string.question_6, true),
        Question(R.string.question_7, false),
        Question(R.string.question_8, true),
        Question(R.string.question_9, false),
        Question(R.string.question_10, false),
        Question(R.string.question_11, false),
        Question(R.string.question_12, true),
        Question(R.string.question_13, false),
        Question(R.string.question_14, true),
        Question(R.string.question_15, false),
        Question(R.string.question_16, false),
        Question(R.string.question_17, true),
        Question(R.string.question_18, false),
        Question(R.string.question_19, false),
        Question(R.string.question_20, true)
)

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    val questionStack = Stack<Question>()

    questionStack.push(questions.first())

    findViewById<Button>(R.id.previous_button).setOnClickListener  {
        if (questionStack.isNotEmpty()) {
            questionStack.pop()
            if (questionStack.isNotEmpty()) {
                questionStack.peek().also { previousQuestion ->
                    findViewById<TextView>(R.id.text_question).setText(previousQuestion.resourceId)
                }
            }
        }
    }

    findViewById<Button>(R.id.next_button).setOnClickListener {
        if (questionStack.size + 1 <= questions.size) {
            questionStack.push(questions.elementAt(questionStack.size))
            questionStack.peek().also { nextQuestion ->
                findViewById<TextView>(R.id.text_question).setText(nextQuestion.resourceId)
            }
        }
    }
}

Это означает, что вы можете избавиться от переменной questionIndex и всего кода, связанного с ее обновлением. Кроме того, стек является хорошим способом моделирования простого линейного прямого / обратного потока, когда пользователь нажимает назад, вы открываете стек, и предыдущий вопрос теперь является вопросом над стеком. Когда пользователь нажимает «следующий», вы кладете sh следующий вопрос в стек, и это новый текущий вопрос. Очевидно, вам нужно сделать небольшую проверку работоспособности, прежде чем заглядывать / выталкивать стек (но это включено в мой ответ выше).

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