Satori_Kanzo
@Satori_Kanzo
Make code not war

Как создать кнопку, которая циклически перебирает элементы массива?

Имеются следующие элементы и их назначения(весь код приводить не буду, думаю и так все понятно):

private Button next_button;
 private TextView mQuestionTextView;
 private int mCurrentIndex = 0;
 private TrueFalse[] mQuestionBank = new TrueFalse[] {
            new TrueFalse(R.string.question_ocean, true),
            new TrueFalse(R.string.question_mideast, false),
            new TrueFalse(R.string.question_africa, false),
            new TrueFalse(R.string.question_americas, true),
            new TrueFalse(R.string.question_asia, true)
    };

    <b>private void updateQuestion() {
        if (mCurrentIndex != -1) {
            int question = mQuestionBank[mCurrentIndex].getQuestion();
            mQuestionTextView.setText(question);
        } else {
            throw new ArrayIndexOutOfBoundsException("ArrayIndexOutOfBoundException");
            mQuestionTextView.setText(arrayExc);</b>


Далее в методе onCreate это происходит так:
Button mPrevButton = (Button)findViewById(R.id.prevButton);
        mPrevButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v)  {
                    mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length;
                    updateQuestion();
                }
        });


Все работает только для элемента массива > 0, иначе, разумеется, появляется ArrayIndexOutOfBoundsException.
(Жирный код до моих попыток исправить ситуацию выглядел как
int question = mQuestionBank[mCurrentIndex].getQuestion();
            mQuestionTextView.setText(question);
, без if/else. в методе updateQuestion.

При этом кнопка "Next", перебирающая элементы массива работает циклически, и не возникает исключения выходы за пределы массива:

mNextButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length;
                updateQuestion();


Суть проблемы: две кнопки, пользующие одинаковые методы, но одна работает в положительную сторону нормально
mCurrentIndex = (mCurrentIndex + 1) % mQuestionBank.length
;, а другая
mCurrentIndex = (mCurrentIndex - 1) % mQuestionBank.length;
не работает.
  • Вопрос задан
  • 466 просмотров
Решения вопроса 1
Все работает только для элемента массива > 0, иначе, разумеется, появляется ArrayIndexOutOfBoundsException

Вы же сами и указали причину из-за которой все валится.
(mCurrentIndex - 1) % mQuestionBank.length = -1 , при mCurrentIndex = 0

исправить prevButton можно, например, так
public void onClick(View v)  {
  mCurrentIndex--;
  if (mCurrentIndex == -1) {
    mCurrentIndex = mQuestionBank.length - 1;
  }
  updateQuestion();
}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы