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

Não está atualizando os dados após as novas implementações.

Fiz todo o processo visto em aula para atulização do BaseAdapter, porém quando tento atualizar os dados da ListView no aplicativo, nada acontece, e olhando no log aparece a seguinte mensagem:

2019-02-15 11:36:33.067 21511-21525/br.com.alura.agenda E/SpellCheckerSession: ignoring processOrEnqueueTask due to unexpected mState=TASK_CLOSE scp.mWhat=TASK_CLOSE
2019-02-15 11:36:33.072 21511-21525/br.com.alura.agenda E/SpellCheckerSession: ignoring processOrEnqueueTask due to unexpected mState=TASK_CLOSE scp.mWhat=TASK_CLOSE

Meu código está idêntico ao da aula apresentada. Alguma idéia do que seria esse erro? E o porque de não atualizar os dados?

15 respostas

Estou com outra dúvida também, não ficou muito claro pra mim quando que a variável alunos do nosso adapter é inicializada, pois em momento nenhum vejo a lista de alunos da nossa ListaAlunosActivity ser jogada pra ela, em qual momento isso é feito? Vide a variável citada em negrito no código abaixo.

public class ListaAlunosAdapter extends BaseAdapter {

// Essa variável que eu me refiro    
    private final List<Aluno> alunos = new ArrayList<>(); 
    private Context context;

    public ListaAlunosAdapter(Context context) {
        this.context = context;
    }

Ola, tudo bom Clecio?

Cara, você pode postar o código completo aqui, ou disponibilizar no GitHub?

Sobre sua segunda pergunta, você deveria inicializar a variável alunos, pelo construtor, assim quando você instanciar seu adapter, já passaria o contexto e a lista.

Este com certeza é um dos motivos para a lista não estar funcionando. Mas só olhando o restante do código para apontar as correções, beleza

Opa Alessandro Lima Alexandre, blz? Olha só, a minha lista ta inicializando sim, eu só não compreendir quando ela foi inicializada, tipo, como que essa variável que está dentro da minha ListaAlunosAdapter foi preenchida pela lista de alunos, pois em nenhum momento pude obersar essa inicialização, a classe completa esta aqui:

package br.com.alura.agenda.ui.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import br.com.alura.agenda.R;
import br.com.alura.agenda.model.Aluno;

public class ListaAlunosAdapter extends BaseAdapter {

// Essa variável aqui chamada "alunos" que eu me refiro.
    private final List<Aluno> alunos = new ArrayList<>();
    private Context context;

    public ListaAlunosAdapter(Context context) {
        this.context = context;
    }

    @Override
    public int getCount() {
        return alunos.size();
    }

    @Override
    public Aluno getItem(int position) {
        return alunos.get(position);
    }

    @Override
    public long getItemId(int position) {
        return alunos.get(position).getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_aluno, parent, false);
        Aluno alunoDevolvido = alunos.get(position);
        TextView nome = view.findViewById(R.id.item_aluno_nome);
        nome.setText(alunoDevolvido.getNome());
        TextView telefone = view.findViewById(R.id.item_aluno_telefone);
        telefone.setText(alunoDevolvido.getTelefone());
        return view;
    }

    public void clear() {
        alunos.clear();
    }

    public void addAll(List<Aluno> alunos) {
        this.alunos.addAll(alunos);
    }

    public void remove(Aluno aluno) {
        alunos.remove(aluno);
    }
}

O projeto ta rodando, porém quando tento editar algum aluno na lista, as mudanças não são refletidas na mesma, o que eu recebo no meu Log é a seguinte mensagem:

2019-02-15 13:46:05.179 21993-22007/br.com.alura.agenda E/SpellCheckerSession: ignoring processOrEnqueueTask due to unexpected mState=TASK_CLOSE scp.mWhat=TASK_CLOSE

Boa

Você realmente está instanciando a lista alunos, porem, ela não tem nenhum objeto do tipo aluno para ser exibido

Você precisa passar a referência a lista de alunos que você criou na sua Activity, para que o adapter possa exibir na sua ListView

Um bom lugar para fazer isto é no construtor do seu adapter, o código ficaria assim:

public class ListaAlunosAdapter extends BaseAdapter {

    private final List<Aluno> alunos = new ArrayList<>();
    private Context context;

    public ListaAlunosAdapter(Context context, List<Aluno> alunos) {
        this.context = context;
        this.alunos = alunos) ;
    }

//Restante da classe
}

A questão é que na vídeo aula o professor não usa dessa maneira, mesmo assim tentei aqui, e o Android Studio me diz que eu não posso fazer isso por que a variável alunos ser final, daí tirei o final e compilou, porém na classe ListaAlunosActivity da erro pois tenho que enviar a lista, daí peguei pelo dao.todos(), tudo rodou e tal, porém o erro da primeira pergunta continua, eu não consigo editar um aluno da lista. Sempre da esse erro no meu log:

2019-02-15 14:36:45.857 31487-31500/br.com.alura.agenda E/SpellCheckerSession: ignoring processOrEnqueueTask due to unexpected mState=TASK_CLOSE scp.mWhat=TASK_CLOSE

A edição não é refletida na minha lista, porém ela é salva, pelo menos quando eu clico novamente em um aluno da lista que eu tenha editado, ele mostra no formularioActivity os dados atualizados, mas na lista não são mostrados. E no meu Log aparece a mensagem:

ignoring processOrEnqueueTask due to unexpected mState=TASK_CLOSE scp.mWhat=TASK_CLOSE

Eu não fiz este curso, então não sei qual foi a solução que o Alex implementou.

Mas vamos fazer assim, posta o código da sua Activity que mostra a lista, e eu verifico onde esta o problema

Se você esta conseguindo ver a alteração, quando clica novamente no aluno editado, já é um bom sinal, deve ser apenas uma pequena correção mesmo

package br.com.alura.agenda.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.design.widget.FloatingActionButton;
import android.support.v7.app.AppCompatActivity;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;

import br.com.alura.agenda.R;
import br.com.alura.agenda.dao.AlunoDAO;
import br.com.alura.agenda.model.Aluno;
import br.com.alura.agenda.ui.adapter.ListaAlunosAdapter;

import static br.com.alura.agenda.ui.activity.ConstantesActivities.CHAVE_ALUNO;

public class ListaAlunosActivity extends AppCompatActivity {

    public static final String TITULO_APPBAR = "Lista de alunos";
    private final AlunoDAO dao = new AlunoDAO();
    private ListaAlunosAdapter adapter;

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_alunos);
        setTitle(TITULO_APPBAR);

        dao.salva(new Aluno("José", "984343068", "ze@me.com"));
        dao.salva(new Aluno("Anna", "984090734", "anna@icloud.com"));

        configuraFabNovoAluno();
        configuraLista();

    }

    @Override
    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
        super.onCreateContextMenu(menu, v, menuInfo);
        getMenuInflater().inflate(R.menu.activity_lista_alunos_menu, menu);
    }

    @Override
    public boolean onContextItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        if (itemId == R.id.activity_lista_alunos_menu_remover) {
            AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
            Aluno alunoEscolhido = adapter.getItem(menuInfo.position);
            remove(alunoEscolhido);
        }
        return super.onContextItemSelected(item);

    }

    private void configuraFabNovoAluno() {
        FloatingActionButton botaoNovoAluno = findViewById(R.id.activity_lista_alunos_fab_novo_aluno);
        botaoNovoAluno.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                abreFormularioModoInsereAluno();
            }
        });
    }

    private void abreFormularioModoInsereAluno() {
        startActivity(new Intent(this, FormularioAlunoActivity.class));
    }

    @Override
    protected void onResume() {
        super.onResume();
        atualizaAlunos();
    }

    private void atualizaAlunos() {
        adapter.clear();
        adapter.addAll(dao.todos());
    }

    private void configuraLista() {
        ListView listaDeAlunos = findViewById(R.id.activity_lista_alunos_listview);
        configuraAdapter(listaDeAlunos);
        configuraListenerDeCliquePorItem(listaDeAlunos);
        registerForContextMenu(listaDeAlunos);
    }

    private void remove(Aluno aluno) {
        dao.remove(aluno);
        adapter.remove(aluno);
    }

    private void configuraAdapter(ListView listaDeAlunos) {
        adapter = new ListaAlunosAdapter(this);
        listaDeAlunos.setAdapter(adapter);
    }

    private void configuraListenerDeCliquePorItem(ListView listaDeAlunos) {
        listaDeAlunos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Aluno alunoDevolvido = (Aluno) parent.getItemAtPosition(position);
                abreFormularioModoEditaAluno(alunoDevolvido);
            }
        });
    }

    private void abreFormularioModoEditaAluno(Aluno aluno) {
        Intent vaiParaFormularioActivity = new Intent(ListaAlunosActivity.this, FormularioAlunoActivity.class);
        vaiParaFormularioActivity.putExtra(CHAVE_ALUNO, aluno);
        startActivity(vaiParaFormularioActivity);
    }
}
package br.com.alura.agenda.ui.adapter;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

import java.util.ArrayList;
import java.util.List;

import br.com.alura.agenda.R;
import br.com.alura.agenda.model.Aluno;

public class ListaAlunosAdapter extends BaseAdapter {

    private List<Aluno> alunos = new ArrayList<>();
    private Context context;

    public ListaAlunosAdapter(Context context) {
        this.context = context;
    }

    @Override
    public int getCount() {
        return alunos.size();
    }

    @Override
    public Aluno getItem(int position) {
        return alunos.get(position);
    }

    @Override
    public long getItemId(int position) {
        return alunos.get(position).getId();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View viewCriada = LayoutInflater.from(context).inflate(R.layout.item_aluno, parent, false);
        Aluno alunoDevolvido = alunos.get(position);
        TextView nome = viewCriada.findViewById(R.id.item_aluno_nome);
        nome.setText(alunoDevolvido.getNome());
        TextView telefone = viewCriada.findViewById(R.id.item_aluno_telefone);
        telefone.setText(alunoDevolvido.getTelefone());
        return viewCriada;
    }

    public void clear() {
        alunos.clear();
    }

    public void addAll(List<Aluno> alunos) {
        this.alunos.addAll(alunos);
    }

    public void remove(Aluno aluno) {
        alunos.remove(aluno);
    }
}
package br.com.alura.agenda.ui.activity;

import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;

import br.com.alura.agenda.R;
import br.com.alura.agenda.dao.AlunoDAO;
import br.com.alura.agenda.model.Aluno;

import static br.com.alura.agenda.ui.activity.ConstantesActivities.CHAVE_ALUNO;

public class FormularioAlunoActivity extends AppCompatActivity {

    private static final String TITULO_APPBAR_NOVO_ALUNO = "Novo aluno";
    private static final String TITULO_APPBAR_EDITA_ALUNO = "Edita aluno";
    private EditText campoNome;
    private EditText campoTelefone;
    private EditText campoEmail;
    private final AlunoDAO dao = new AlunoDAO();
    private Aluno aluno;

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

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_formulario_aluno_menu, menu);
        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        int itemId = item.getItemId();
        if (itemId == R.id.activity_formulario_aluno_menu_salvar)
            finalizaFormulario();
        return super.onOptionsItemSelected(item);
    }

    private void carregaAluno() {
        Intent dados = getIntent();
        if (dados.hasExtra(CHAVE_ALUNO)){
            setTitle(TITULO_APPBAR_EDITA_ALUNO);
            aluno = (Aluno) dados.getSerializableExtra(CHAVE_ALUNO);
            preencheCampos();
        } else{
            setTitle(TITULO_APPBAR_NOVO_ALUNO);
            aluno = new Aluno();
        }
    }

    private void preencheCampos() {
        campoNome.setText(aluno.getNome());
        campoTelefone.setText(aluno.getTelefone());
        campoEmail.setText(aluno.getEmail());
    }



    private void finalizaFormulario() {
        preencheAluno();
        if (aluno.temIdValido()){
            dao.edita(aluno);
        } else{
            dao.salva(aluno);
        }
        finish();
    }

    private void inicializacaoDosCampos() {
        campoNome = findViewById(R.id.activity_formulario_aluno_nome);
        campoTelefone = findViewById(R.id.activity_formulario_aluno_telefone);
        campoEmail = findViewById(R.id.activity_formulario_aluno_email);
    }

    private void preencheAluno() {
        String nome = campoNome.getText().toString();
        String telefone = campoTelefone.getText().toString();
        String email = campoEmail.getText().toString();

        aluno.setNome(nome);
        aluno.setTelefone(telefone);
        aluno.setEmail(email);

    }
}

Pronto, mandei das 3 principais classes, todas estão como pedido nas aulas, tudo está rodando, o aplicativo sobe blz, porém quando eu edito um aluno, o mesmo não é refletido com a alteração na lista, tão somente quando eu volto a clicar nele e me abre o formulário novamente. Não conseguir encontrar o erro, sendo que em dado momento analisando o Log, me é mostrada a seguinte mensagem:

2019-02-15 13:46:05.179 21993-22007/br.com.alura.agenda E/SpellCheckerSession: ignoring processOrEnqueueTask due to unexpected mState=TASK_CLOSE scp.mWhat=TASK_CLOSE

Ola Clecio

Cara, demorei um pouco pra entender seu problema. Debugando o código, a lista é preenchida normalmente, mas sem debugar ela não é preenchida kkk

Pesquisei um pouco e encontrei este tópico no stackoverflow.

Basicamente, com esta implementação, você precisa notificar o adapter que você alterou os dados da lista utilizando o método notifyDataSetChanged()

Uma possível implementação seria a seguinte:

Na classe ListaAlunosAdapter

public void addAll(List<Aluno> alunos) {
        this.alunos.addAll(alunos);
        notificaAdapter();
    }

    public void remove(Aluno aluno) {
        alunos.remove(aluno);
        notificaAdapter();
    }

    private void notificaAdapter(){
        this.notifyDataSetChanged();
    }

E sobre a sua dúvida, onde a lista de alunos é inicializada:

Ela é inicializada na chamada do método onResume, este método faz parte do ciclo de vida da Activity . Com isto, você garante que ele sempre será chamado e ao ser executado, este método vai "limpar" e inicializar a sua lista com os usuários que você tem no seu banco.

solução!

Realmente, agora entendi, kkkkk... Obrigado Alessandro!!! Desculpa pelo meu vacilo, é que ainda sou iniciante. kkkk

Fica tranquilo Clecio

O fórum esta aqui pra ajudar mesmo, qualquer dúvida só perguntar

Se a dúvida foi resolvida, só marca o tópico como resolvido ok

Abç