Тест карточек / Запоминание в Andoird Studio / Котлин - PullRequest
0 голосов
/ 08 января 2020

Извините за длинный пост! Я пытаюсь сделать карту памяти для запоминания, и я застрял с ней в течение недели

Вот массив

val sentenceArray = arrayOfNulls<String>(8)
    sentenceArray[0] = ""
    sentenceArray[1] = "Array 1 (1)"
    sentenceArray[2] = "Array 2 (2)"
    sentenceArray[3] = "Array 3 (3)"
    sentenceArray[4] = "Array 4 (4)"
    sentenceArray[5] = "Array 5 (5)"


Это код. Для генерации теста есть 2 счетчика (левый и правый). Если пользователь выбрал 1 для левого счетчика и 3 для правого счетчика, он будет отображать только массивы от 1 до 3 каждый раз, когда пользователь нажимает на textView

leftSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener
{
    override fun onNothingSelected(parent: AdapterView<*>?) {}
    override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long)
    {
        //Stores value of the selected Left Spinner
        val selectedLeftSpinner = leftSpinner.getItemAtPosition(position).toString()

        rightSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener
        {
            override fun onNothingSelected(parent: AdapterView<*>?) {}
            override fun onItemSelected(parent: AdapterView<*>?, view: View?, position: Int, id: Long)
            {
                //Actions when buttonStart is clicked
                buttonStart.setOnClickListener {

                    //Stores value of the selected Right Spinner
                    val selectedRightSpinner = rightSpinner.getItemAtPosition(position).toString()

                    //Stores selectedLeftSpinner value to firstSentence so that it can be used
                    var firstSentence = selectedLeftSpinner.toInt()

                    //Stores selectedRightSpinner value to lastSentence so that it can be used
                    val lastSentence = selectedRightSpinner.toInt()

                    //Displays (1)
                    textView.text = sentenceArray[firstSentence]?.takeLast(3)

                    //Waiting for an action on the TextView
                    textView.setOnClickListener {

                        //Displays (Array 1)
                        textView.text = sentenceArray[firstSentence]

                        //Waiting for an action on the TextView
                        textView.setOnClickListener {
                            while (firstSentence < lastSentence) {

                                //This while loop displays Array 1 to 5 each time a user clicks on textView
                                firstSentence++

                                textView.text = sentenceArray[firstSentence]

                                //Ends the test when it reaches the last array
                                if (firstSentence == lastSentence) {
                                    buttonStart.text = "DONE"
                                }
                                break
                            }
                        }
                    }
                }
            }
        }
    }
}

Что я пытаюсь сделать: после того, как пользователь выбрал значение из левого счетчика (например, 1) и правого счетчика (например, 3), они нажимают кнопку Старт, чтобы запустить флэш-карту. TextView начинает отображать (1). Чтобы раскрыть ответ, они могли бы нажать на textView, а затем он отобразит «Массив 1». Затем они щелкнули бы на textView, и он отобразит (2) ... et c

Таким образом, поток должен быть таким, после нажатия на textView на каждом шаге
(1)
Array 1
(2)
Array 2
(3)
Arra3 3
DONE

С моим током, пока l oop

while (firstSentence < lastSentence) {

                                //This loop displays Array 1 to 5 each time a user clicks on textView
                                firstSentence++

                                textView.text = sentenceArray[firstSentence]

                                //Ends the test when it reaches the last aya
                                if (firstSentence == lastSentence) {
                                    buttonStart.text = "DONE"
                                }
                                break
                            }

Это текущий поток
(1)
Массив 1
Массив 2
Массив 3
СОВЕРШЕНО

Я много чего пробовал, но не смог заставить его работать, и понятия не имею
Вот 2 разных кода, которые я пробовал, которые не работали. Это было в то время как l oop

textView.setOnClickListener {
                                        if (textView.text == sentenceArray[firstSentence])
                                        textView.text = sentenceArray[firstSentence]?.takeLast(3)
                                    }

и этот код

if (firstSentence < lastSentence)
                                    {
                                        textView.setOnClickListener {
                                            textView.text = sentenceArray[firstSentence]?.takeLast(3)
                                        }
                                    }

2 кода приводят к этому потоку
(1)
Array 1
Массив 2
(2)
СОВЕРШЕНО, когда предполагается, что он будет продолжать (3)

1 Ответ

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

Вам действительно не нужно все oop, так как цикл обрабатывается пользователем, щелкающим текстовое представление, в вашем случае условия if будет достаточно.

Еще одна вещь, которую я заметил, это то, что вы устанавливаете Ваши слушатели щелчка и вращающиеся слушатели в других слушателях. это не требуется и делает ваш код нечитаемым и сложным для анализа. Обратите внимание, что в вашем случае вы можете определить всех слушателей на одном уровне для достижения желаемого, вам не нужно их вкладывать.

Вы можно сделать что-то следующим образом. Я поднял конфигурацию вложенного слушателя.

   class Temp {

    lateinit var leftSpinner: Spinner
    lateinit var rightSpinner: Spinner
    lateinit var buttonStart: Button
    lateinit var sentenceArray: Array<String>
    lateinit var textView: TextView
    var selectedLeftSpinner = -1
    var selectedRightSpinner = -1

   private fun setup() {

        /** Define left spinner item selected listener, capture the selected position */
        leftSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {}
            override fun onItemSelected(
                parent: AdapterView<*>?, view: View?,
                position: Int, id: Long) {
                selectedLeftSpinner = position
            }
        }

        /** Define right spinner item selected listener, capture the selected position */
        rightSpinner.onItemSelectedListener = object : AdapterView.OnItemSelectedListener {
            override fun onNothingSelected(parent: AdapterView<*>?) {}
            override fun onItemSelected(
                parent: AdapterView<*>?, view: View?,
                position: Int, id: Long) {
                selectedRightSpinner = position
            }
        }

        /** Define button start click listener, show text if left spinner is selected. */
        buttonStart.setOnClickListener {
            /** only set text if left spinner is selecte */
            if(selectedLeftSpinner != -1){
                textView.text = sentenceArray[selectedLeftSpinner]?.takeLast(3)
            }
        }

/** Handle edge cases, such as what happens if spinner is not selected */
    textView.setOnClickListener {
        /** if currently selected item's last 3 chars are being shown,
         *  then show the answer.
         */
        if(textView.text == sentenceArray[selectedLeftSpinner]?.takeLast(3)){
            textView.text = sentenceArray[selectedLeftSpinner]
        }
        /** if answer is being shown then show last three chars of next item */
        else if(selectedLeftSpinner < selectedRightSpinner){
            selectedLeftSpinner++
            textView.text = sentenceArray[selectedLeftSpinner]?.takeLast(3)
        }
        /** else we have reached the last item */
        else{
            buttonStart.text = "DONE"
            /** reset left spinner to not selected state */
            selectedLeftSpinner = -1
        }
    }

    }
}

Это должно работать, но я не рассматривал какие-либо крайние случаи, поэтому вам придется позаботиться о них, и есть место для других улучшений, таких как usig a ключ, структура значений (ex map) для хранения вашей карты sh вопрос карты и ответы на код все еще могут быть уменьшены, так как оба слушателя для счетчиков одинаковы, я оставляю это как упражнение.

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