3
respostas

Ao delegar crashou!

Por favor, quem puder me ajudar. Ao tentar migrar o código de ListaContatosActivity.java para ListaContatosView.java o app crashou. Estou usando uma classe ViewHolder e foi nela o problema. Seu atributo listaDeContatos não ficou visível. Alguém puder dar uma luz. Obrigado!

public class ListaContatosActivity extends AppCompatActivity implements View.OnClickListener {

    private static final String TITLE_LISTA = "E aí!?";

    private ViewHolder mViewHolder = new ViewHolder();
    private final ContatoDAO dao = new ContatoDAO();
    private ListaContatosAdapter adapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_lista_contatos);
        setTitle(TITLE_LISTA);
        configuraFabNovoContato();
        configuraLista();
    }

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

    @Override
    public boolean onContextItemSelected(final MenuItem item) {
        if (item.getItemId() == R.id.activity_lista_contatos_menu_remover) {
            confirmaRemocao(item);
        }
        return super.onContextItemSelected(item);
    }

    private void confirmaRemocao(final MenuItem item) {
        new AlertDialog
                .Builder(this)
                .setTitle("Excluindo Contato")
                .setMessage("Tem certeza que deseja excluir o contato?")
                .setPositiveButton("Sim", new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
                        Contato contatoSelecionado = adapter.getItem(menuInfo.position);
                        remove(contatoSelecionado);
                    }
                })
                .setNegativeButton("Não", null)
                .show();
    }

    private void configuraFabNovoContato() {
        this.mViewHolder.buttonNovoContato = findViewById(R.id.activity_lista_alunos_fab);
        this.mViewHolder.buttonNovoContato.setOnClickListener(this);
    }

    @Override
    protected void onResume() {
        super.onResume(); // É o que deve ser feito no onResume (recarregar) da página
        atualizaContatos();
    }

    private void atualizaContatos() {
        adapter.atualiza(dao.todos());
    }

    private void configuraLista() {
        this.mViewHolder.listaDeContatos = findViewById(R.id.activity_lista_contatos_lvContatos);
        final List<Contato> contatos = dao.todos();
        configuraAdapter(contatos);
        configuraListenerDeClickPorItem(contatos);
        registerForContextMenu(this.mViewHolder.listaDeContatos);
    }

    private void remove(Contato contato) {
        dao.remove(contato);
        adapter.remove(contato);
    }

    private void configuraListenerDeClickPorItem(final List<Contato> contatos) {
        this.mViewHolder.listaDeContatos.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                 Contato contatoSelecionado = (Contato) adapterView.getItemAtPosition(position);
                 abreFormularioModoEditaContato(contatoSelecionado);
            }
        });
    }

    private void abreFormularioModoEditaContato(Contato contatoSelecionado) {
        Intent vaiParaFormularioActivity = new Intent(ListaContatosActivity.this, FormularioContatoActivity.class);
        vaiParaFormularioActivity.putExtra(CHAVE_CONTATO, contatoSelecionado);
        startActivity(vaiParaFormularioActivity);
    }

    private void configuraAdapter(List<Contato> contatos) {
        adapter = new ListaContatosAdapter(this);
        this.mViewHolder.listaDeContatos.setAdapter(adapter);
    }

    @Override
    public void onClick(View v) {
        abreFormularioContatoActivity();
    }

    private void abreFormularioContatoActivity() {
        startActivity(new Intent(this, FormularioContatoActivity.class));
    }

    private static class ViewHolder {
        FloatingActionButton buttonNovoContato;
        ListView listaDeContatos;
    }
}
3 respostas

Oi Rodrigo, tudo bem? Dá uma olhada no LogCat e cola aqui as mensagens de erro que ele está imprimindo, assim a gente tem uma ideia melhor de onde olhar no código para encontrar o problema. Assim olhando o código sem a mensagem de erro, não dá pra ser muito assertivo na solução.

Wanderson, obrigado pela atenção. Eu tentei, em vez de definir as variáveis buttonNovoContato e listaDeContatos não lá em cima como final, mas sim dentro de uma classe. Porém tive dificuldades na hora de delegar os 4 métodos para outra classe. Mas resolvi refazer essa parte e escrever tal como descrito pelo Felipe e acabou dando certo. Obrigado!

Entendi, desculpa a demora pra te ajudar.

Já que você já resolveu, marca o tópico como solucionado por favor? Seu post já indica qual foi o problema e como solucionou, então, podemos fazer isso. No seu post clica em "marcar como solução".

Tudo bem?

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software