Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Erro: java.lang.IndexOutOfBoundsException: Invalid index 9, size is 9

O que fazer? Tenho um metodo de busca e outro para chamar, porém está dando este erro... Já tentei um if e um for, mas nenhum resolveu.

public class Carro implements Serializable {

    private Long id;
    private String pergunta;
    private String resposta;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getPergunta() {
        return pergunta;
    }

    public void setPergunta(String pergunta) {
        this.pergunta = pergunta;
    }

    public String getResposta() {
        return resposta;
    }

    public void setResposta(String resposta) {
        this.resposta = resposta;
    }
}
    public List<Carro> buscaPergunta() {
        List<Carro> carros = new ArrayList<>();
        Cursor c = dao.getReadableDatabase().rawQuery("SELECT carro_pergunta FROM Carro", null);
        while (c.moveToNext())
            carros.add(criaPerguntaCarro(c));
        c.close();
        return carros;
    }
public class InspecaoActivity extends AppCompatActivity {

    private TextView nomeInsp, campoPergunta;
    private int indicePerguntaAtual = 0;
    private Button proximaPergunta;
    private Carro perguntaAtual;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_inspecao);

        setTitle("");
        carregaNomeDoCheckList();
        botaoProximo();
    }

    private void carregaNomeDoCheckList() {
        if (nomeInsp!=null) {
            carregaNomeInspecao();
        }else{
            nomeInsp = findViewById(R.id.nomeInsp);
            nomeInsp.setText("Check List Carro");
        }
    }

    private void botaoProximo() {
        proximaPergunta = findViewById(R.id.proximaPergunta);
        proximaPergunta.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
               responde();
            }
        });
    }

    public void responde() {
           indicePerguntaAtual++;
           atualizaformularioComPerguntaAtual();
    }

    private void atualizaformularioComPerguntaAtual() {
        CarroDAO dao = new CarroDAO(InspecaoActivity.this);
        List<Carro> carros = dao.buscaPergunta();

        perguntaAtual = carros.get(indicePerguntaAtual);

            campoPergunta = findViewById(R.id.pergunta);
            campoPergunta.setText(perguntaAtual.getPergunta());

            Toast.makeText(InspecaoActivity.this, "Não há perguntas!", Toast.LENGTH_SHORT).show();
    }

    private void carregaNomeInspecao() {
        Intent intent = getIntent();
        Inspecao inspecao = (Inspecao) intent.getSerializableExtra("nome");
        nomeInsp = findViewById(R.id.nomeInsp);
        nomeInsp.setText(inspecao.getNome());
    }

}

O erro:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.hlnengenharia.app, PID: 10505
                  java.lang.IndexOutOfBoundsException: Invalid index 9, size is 9
                      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:260)
                      at java.util.ArrayList.get(ArrayList.java:313)
                      at br.com.hlnengenharia.app.InspecaoActivity.atualizaformulario(InspecaoActivity.java:66)
                      at br.com.hlnengenharia.app.InspecaoActivity.responde(InspecaoActivity.java:57)
                      at br.com.hlnengenharia.app.InspecaoActivity$1.onClick(InspecaoActivity.java:50)
                      at android.view.View.performClick(View.java:5265)
                      at android.view.View$PerformClick.run(View.java:21534)
                      at android.os.Handler.handleCallback(Handler.java:815)
                      at android.os.Handler.dispatchMessage(Handler.java:104)
                      at android.os.Looper.loop(Looper.java:207)
                      at android.app.ActivityThread.main(ActivityThread.java:5728)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:679)
3 respostas
solução!

Boa noite, Rafaela! Como vai?

O que está acontecendo é que vc está tentando acessar uma posição do ArrayList que não existe. Isso deve estar ocorrendo nessa linha perguntaAtual = carros.get(indicePerguntaAtual). Repare que no seu método responde() vc incrementa o valor da variável indicePerguntaAtual e depois chama atualizaformularioComPerguntaAtual(). Sendo que nessa brincadeira, em algum momento o valor de indicePerguntaAtual passa a ser 9 que é um índice inexistente.

Tente fazer isso e veja se soluciona:

private void atualizaformularioComPerguntaAtual() {
        CarroDAO dao = new CarroDAO(InspecaoActivity.this);
     List<Carro> carros = dao.buscaPergunta();

     if (indicePerguntaAtual < carros.size()) {
          perguntaAtual = carros.get(indicePerguntaAtual);

          campoPergunta = findViewById(R.id.pergunta);
          campoPergunta.setText(perguntaAtual.getPergunta());
     } else {
          Toast.makeText(InspecaoActivity.this, "Não há perguntas!", Toast.LENGTH_SHORT).show();
     }
}

Grande abraço e bons estudos!

Bom dia, Gabriel. Sua resposta, resolveu meu problema... porém gostaria de aproveitar o tópico para já fazer outra pergunta. Eu preciso que além do meu Array percorrer as perguntas ele também salve as respostas que estão em radioButton. Como eu deveria proceder nesse caso?

Meu código está desta forma:

public class InspecaoActivity extends AppCompatActivity {

    private TextView nomeInsp, campoPergunta;
    private int indicePerguntaAtual = 0;
    private Button proximaPergunta;
    private Carro perguntaAtual;
    private RadioButton c,nc,na;
    private RadioGroup rg;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_inspecao);

        setTitle("");
        carregaNomeDoCheckList();

        botaoProximo();


    }

    private void carregaNomeDoCheckList() {
        if (nomeInsp!=null) {
            carregaNomeInspecao();
        }else{
            nomeInsp = findViewById(R.id.nomeInsp);
            nomeInsp.setText("Check List Carro");
        }
    }

    private void botaoProximo() {
        proximaPergunta = findViewById(R.id.proximaPergunta);
        proximaPergunta.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Carro carro = new Carro();
                CarroDAO dao = new CarroDAO(InspecaoActivity.this);

                reconheceBotões(carro);
                if(!c.isChecked() && !nc.isChecked() && !na.isChecked()){
                    Toast.makeText(InspecaoActivity.this, "Preencha o formulário corretamente!", Toast.LENGTH_SHORT).show();
                }else{
                    dao.insereResposta(carro);
                }
                responde();
            }
        });
    }

    private void reconheceBotões(Carro carro) {
        c = findViewById(R.id.conforme);
        nc = findViewById(R.id.nConforme);
        na = findViewById(R.id.nSeAplica);
        rg = findViewById(R.id.radioGroup);
        campoPergunta = findViewById(R.id.pergunta);

            carro.setPergunta(campoPergunta.getText().toString());
            carro.setResposta(nc.getText().toString());
            carro.setResposta(na.getText().toString());
            carro.setResposta(c.getText().toString());

    }

    public void responde() {
        indicePerguntaAtual++;
        atualizaFormularioComPerguntaAtual();
    }

    private void atualizaFormularioComPerguntaAtual() {
        CarroDAO dao = new CarroDAO(InspecaoActivity.this);
        List<Carro> carros = dao.buscaPergunta();
        if (indicePerguntaAtual < carros.size()) {
            perguntaAtual = carros.get(indicePerguntaAtual);

            campoPergunta = findViewById(R.id.pergunta);
            campoPergunta.setText(perguntaAtual.getPergunta());
        } else {
            Toast.makeText(InspecaoActivity.this, "Não há perguntas!", Toast.LENGTH_SHORT).show();
            finish();
        }
    }

    private void carregaNomeInspecao() {
        Intent intent = getIntent();
        Inspecao inspecao = (Inspecao) intent.getSerializableExtra("nome");
        nomeInsp = findViewById(R.id.nomeInsp);
        nomeInsp.setText(inspecao.getNome());
    }

}
    public void insereResposta(Carro carro) {
        ContentValues values = new ContentValues();
        values.put("carro_pergunta", carro.getPergunta());
        values.put("carro_resposta", carro.getResposta());
        dao.getWritableDatabase().insert("Carro", null, values);
    }

Rafaela, infelizmente quanto a isso eu não vou poder te ajudar pq não tenho mta familiaridade com o Android.

Eu vou dar esse tópico como resolvido já que o problema original foi sanado. Daí vc pode abrir um outro tópico para tratar desse problema específico!

Grande abraço e bons estudos!