Skip to content

Instantly share code, notes, and snippets.

@vinnom
Last active June 30, 2020 20:05
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save vinnom/7a70d44e1ec2b555f6f87e076b88895d to your computer and use it in GitHub Desktop.
Save vinnom/7a70d44e1ec2b555f6f87e076b88895d to your computer and use it in GitHub Desktop.
Lista de alunos só carrega após ir para o Formulário e voltar
package br.com.alura.agenda.ui.asynctask;
import android.os.AsyncTask;
import java.util.List;
import br.com.alura.agenda.model.Aluno;
import br.com.alura.agenda.room.AlunoDao;
public class AtualizaListaAsyncTask extends AsyncTask<Void, Void, List<Aluno>> {
private final List<Aluno> alunos;
private final AlunoDao alunoDao;
private final DepoisDaExecucao depoisDaExecucao;
public AtualizaListaAsyncTask(List<Aluno> alunos, AlunoDao alunoDao, DepoisDaExecucao depoisDaExecucao){
this.alunos = alunos;
this.alunoDao = alunoDao;
this.depoisDaExecucao = depoisDaExecucao;
}
@Override
protected List<Aluno> doInBackground(Void... voids){
List<Aluno> todosAlunos = alunoDao.listagem();
return todosAlunos;
}
@Override
protected void onPostExecute(List<Aluno> todosAlunos){
super.onPostExecute(alunos);
alunos.clear();
alunos.addAll(todosAlunos);
depoisDaExecucao.executa();
}
public interface DepoisDaExecucao{
void executa();
}
}
package br.com.alura.agenda.ui.asynctask;
import java.util.List;
import br.com.alura.agenda.model.Telefone;
public interface DefineTelefonesListener {
void defineNumerosTelefone(List<Telefone> telefones);
}
package br.com.alura.agenda.ui.asynctask;
import android.os.AsyncTask;
import android.widget.TextView;
import br.com.alura.agenda.model.Telefone;
import br.com.alura.agenda.room.TelefoneDao;
public class DevolvePrimeiroTelefoneAsyncTask extends AsyncTask<Void, Void, Telefone> {
private final TelefoneDao telefoneDao;
private final int alunoId;
private final DevolvePrimeiroTelefone telefoneListener;
public DevolvePrimeiroTelefoneAsyncTask(TelefoneDao telefoneDao, int alunoId, DevolvePrimeiroTelefone telefoneListener){
this.telefoneDao = telefoneDao;
this.telefoneListener = telefoneListener;
this.alunoId = alunoId;
}
@Override
protected Telefone doInBackground(Void... voids){
Telefone primeiroTelefone = telefoneDao.devolvePrimeiroTelefone(alunoId);
if(primeiroTelefone != null){
telefoneListener.devolveQuandoEncontrado(primeiroTelefone);
}
return primeiroTelefone;
}
@Override
protected void onPostExecute(Telefone telefone){
super.onPostExecute(telefone);
}
public interface DevolvePrimeiroTelefone {
void devolveQuandoEncontrado(Telefone telefone);
}
}
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;
import br.com.alura.agenda.room.AgendaBD;
import br.com.alura.agenda.room.AlunoDao;
import br.com.alura.agenda.room.TelefoneDao;
import br.com.alura.agenda.ui.asynctask.AtualizaListaAsyncTask;
import br.com.alura.agenda.ui.asynctask.DevolvePrimeiroTelefoneAsyncTask;
import br.com.alura.agenda.ui.asynctask.RemoveAlunoAsyncTask;
public class ListaAlunoAdapter extends BaseAdapter {
private final Context context;
private final TelefoneDao telefoneDao;
private final AlunoDao alunoDao;
private List<Aluno> alunos;
public ListaAlunoAdapter(Context context) {
this.context = context;
alunoDao = AgendaBD.getInstance(context).getRoomAlunoDao();
telefoneDao = AgendaBD.getInstance(context).getTelefoneDao();
alunos = new ArrayList<>();
}
@Override
public int getCount() {
return alunos.size();
}
@Override
public Aluno getItem(int posicao) {
return alunos.get(posicao);
}
@Override
public long getItemId(int posicao) {
return alunos.get(posicao).getId();
}
@Override
public View getView(int posicao, View view, ViewGroup viewGroup) {
return defineAlunoItemView(posicao, viewGroup);
}
private View defineAlunoItemView(int posicao, ViewGroup viewGroup) {
Aluno aluno = alunos.get(posicao);
View alunoItemView = LayoutInflater.from(context).inflate(R.layout.item_aluno, viewGroup, false);
TextView campoNome = alunoItemView.findViewById(R.id.item_aluno_nome);
campoNome.setText(aluno.getNome());
TextView campoTelefone = alunoItemView.findViewById(R.id.item_aluno_telefone);
new DevolvePrimeiroTelefoneAsyncTask(telefoneDao, aluno.getId(), telefone -> {
campoTelefone.setText(telefone.getNumero());
}).execute();
return alunoItemView;
}
public void atualizaAdapter() {
new AtualizaListaAsyncTask(alunos, alunoDao, this::notifyDataSetChanged).execute();
}
public void remove(Aluno aluno) {
new RemoveAlunoAsyncTask(aluno, alunos, alunoDao).execute();
}
}
package br.com.alura.agenda.ui.activity;
import android.content.Intent;
import android.os.Bundle;
import android.view.ContextMenu;
import android.view.MenuItem;
import android.view.View;
import android.widget.ListView;
import com.google.android.material.floatingactionbutton.FloatingActionButton;
import androidx.appcompat.app.AppCompatActivity;
import br.com.alura.agenda.R;
import br.com.alura.agenda.model.Aluno;
import br.com.alura.agenda.ui.activity.component.ListaAlunosActivityComponent;
public class ListaAlunosActivity extends AppCompatActivity{
public static final String CHAVE_ALUNO = "aluno";
private static final String TITULO_APPBAR = "Lista de Alunos";
private Intent daListaProForm;
private ListaAlunosActivityComponent component;
@Override
protected void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_lista_alunos);
setTitle(TITULO_APPBAR);
component = new ListaAlunosActivityComponent(this);
defineFabNovoAluno();
}
@Override
protected void onResume(){
super.onResume();
listaAlunos();
component.atualizaLista();
daListaProForm = geraIntentProForm();
}
private void defineFabNovoAluno(){
FloatingActionButton novoAluno = findViewById(R.id.lista_alunos_fab);
abreFormularioNovoAluno(novoAluno);
}
private void listaAlunos(){
ListView listView = findViewById(R.id.lista_alunos_listView);
component.defineListaAdapter(listView);
registerForContextMenu(listView);
abreFormularioEditaAluno(listView);
}
private Intent geraIntentProForm(){
return new Intent(ListaAlunosActivity.this, FormularioAlunoActivity.class);
}
private void abreFormularioNovoAluno(FloatingActionButton novoAluno){
novoAluno.setOnClickListener(view -> startActivity(daListaProForm));
}
private void abreFormularioEditaAluno(ListView listView){
listView.setOnItemClickListener((adapterView, view, posicao, id) -> {
Aluno aluno = (Aluno) adapterView.getItemAtPosition(posicao);
daListaProForm.putExtra(CHAVE_ALUNO, aluno);
startActivity(daListaProForm);
});
}
@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){
component.defineMenuDeContextoRemover(item);
return super.onContextItemSelected(item);
}
}
package br.com.alura.agenda.ui.activity.component;
import android.content.Context;
import android.view.MenuItem;
import android.widget.AdapterView;
import android.widget.ListView;
import androidx.appcompat.app.AlertDialog;
import br.com.alura.agenda.R;
import br.com.alura.agenda.model.Aluno;
import br.com.alura.agenda.room.AgendaBD;
import br.com.alura.agenda.room.AlunoDao;
import br.com.alura.agenda.ui.adapter.ListaAlunoAdapter;
public class ListaAlunosActivityComponent {
private static final String DIALOGO_REMOCAO = "Removendo aluno";
private static final String CONFIRMA_REMOCAO = "Gostaria de remover o aluno?";
private static final String SIM = "SIM";
private static final String NAO = "NÃO";
private ListaAlunoAdapter listaAdapter;
private Context context;
public ListaAlunosActivityComponent(Context context){
this.context = context;
this.listaAdapter = new ListaAlunoAdapter(this.context);
}
public void defineMenuDeContextoRemover(MenuItem item){
final AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int itemId = item.getItemId();
if(itemId == R.id.activity_lista_alunos_menu_remover){
geraDialogoRemocaoAluno(menuInfo);
}
}
private void geraDialogoRemocaoAluno(final AdapterView.AdapterContextMenuInfo menuInfo){
new AlertDialog.Builder(context)
.setTitle(DIALOGO_REMOCAO)
.setMessage(CONFIRMA_REMOCAO)
.setPositiveButton(SIM, (dialogInterface, i) -> {
Aluno aluno = listaAdapter.getItem(menuInfo.position);
remove(aluno);
})
.setNegativeButton(NAO, null)
.create()
.show();
}
public void atualizaLista(){
listaAdapter.atualizaAdapter();
}
public void defineListaAdapter(ListView listView){
listView.setAdapter(listaAdapter);
}
private void remove(Aluno aluno){
listaAdapter.remove(aluno);
listaAdapter.notifyDataSetChanged();
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment