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

Erro de exception ListView

Estou com o seguinte problema quando clico no item de receber as provas, a aplicação para de funcionar e retorna o seguinte erro:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: agenda.alura.com.br.agenda, PID: 10796
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{agenda.alura.com.br.agenda/agenda.alura.com.br.agenda.ProvasActivity}: java.lang.ClassCastException: android.support.v7.widget.CardView cannot be cast to android.widget.ListView
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2416)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476)
                      at android.app.ActivityThread.-wrap11(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:148)
                      at android.app.ActivityThread.main(ActivityThread.java:5417)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                   Caused by: java.lang.ClassCastException: android.support.v7.widget.CardView cannot be cast to android.widget.ListView
                      at agenda.alura.com.br.agenda.ProvasActivity.onCreate(ProvasActivity.java:34)
                      at android.app.Activity.performCreate(Activity.java:6237)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1107)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2369)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2476) 
                      at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:148) 
                      at android.app.ActivityThread.main(ActivityThread.java:5417) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

código na linha que está acusando o erro:

ListView lista = (ListView) findViewById(R.id.provas_lista);

O código está exatamente como no curso, porém está retornando esse erro. Fico no aguardo

6 respostas

Fala ai Thiago, de boa ?

Cara, dá uma olhadinha nos seus ids dessa página, acho que você errou o local, rs.

Ele tá falando que a view que está buscando é um CardView e ai o cast não é feito corretamente.

Pois é, pior que não está errado o id, até pq ja conferi e está exatamente igual o código do curso, no vídeo do curso a aplicação executa normal, mas aqui retorna essa exception. E a View é mesmo uma CardView.

Mostra seu layout e qual lugar está usando para batermos os valores

ok, segue o layout e uma parte dos dois arquivos java irão usar o layout.

Layout: menu_lista_alunos.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/provas_lista"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardElevation = "5dp"
    app:cardUseCompatPadding="true"><!-- cardElevation adiciona uma elevação sombra com 5dp -->
    <ListView
        android:id="@+id/provas_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</android.support.v7.widget.CardView>''

ListaAlunosActivity.java:

    //método para adicionar itens do menu de ação
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_lista_alunos,menu); //pega o menu do xml e leva para o objeto java, e coloca no menu
        return true;//para que o menu possa aparecer
    }

    //método para criar ação para os itens do menu de ação
    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_enviar_notas://para o id do item enviado
                new EnviaAlunosTask(this).execute();//Instancia o método de enviar o aluno na thread secundária, passando o context e executando
                break;
            case R.id.menu_baixar_provas:
                Toast.makeText(this,"botao provas clicado",Toast.LENGTH_SHORT).show();
                Intent vaiParaProvas = new Intent (this,ProvasActivity.class); // cria intent para ir para a activity provas
                startActivity(vaiParaProvas);//executa a itent
                break;

        }
        return super.onOptionsItemSelected(item);
    }

ProvasActivity.java :

public class ProvasActivity extends AppCompatActivity {

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

        List<String> topicosPort = Arrays.asList("Sujeito","Objeto direto","Objeto indireto");//cria os topicos de portugues, usa o método arrays.aslist adiciona varios itens na lista
        Prova provaPortugues = new Prova("Portugues","25/05/2016",topicosPort);//cria a prova

        List<String> topicosMat = Arrays.asList("Equacoes do segundo grau","Trigonometria");
        Prova provaMatematica = new Prova("Matematica","27/05/2016",topicosMat);

        List<Prova> provas = Arrays.asList(provaPortugues,provaMatematica);//adiciona as provas criadas na lista de prova

        ArrayAdapter<Prova> adapter = new ArrayAdapter<>(this, android.R.layout.simple_list_item_1, provas);//cria o adapter para pegar um objeto e salvar na view, na tela

        ListView lista = (ListView) findViewById(R.id.provas_lista);//busca o xml da prova
        lista.setAdapter(adapter);//usa o adapter

        //adiciona evento de clique no item da lista
        lista.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

                Prova prova = (Prova) parent.getItemAtPosition(position);//pega a posição da prova como objeto
                Toast.makeText(ProvasActivity.this,"Clicou na prova de " + prova, Toast.LENGTH_SHORT).show();//apresenta o toast para quando o item da lista for clicado
            }
        });
    }
}
solução!

Fala ai Tiago,

Cara dá uma olhada nisso :

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/provas_lista"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    app:cardElevation = "5dp"
    app:cardUseCompatPadding="true">

O id que está usando é provas_lista, ou seja o cardview tem esse id.

ListView lista = (ListView) findViewById(R.id.provas_lista);//busca o xml da prova

Quando você faz essa linha ele fala que o cast não pode ser realizado, dado que esse id não representa um listview e sim um cardview.

   <ListView
        android:id="@+id/provas_id"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

Sua lista tem o seguinte id : provas_id

Era isso mesmo, obrigado!! falta de atenção mesmo...