update ListView using notifyDataSetChanged ();

1

I have two screens, one with a main list loaded with DB data and one data file, after inserting some data, the registration screen closes and returns to the main list, I am having trouble updating the ListView screen main. I made it work, but I'm not sure it's right.

EDIT : main activity change

My Activity from the list.

public class MainActivity extends AppCompatActivity {
private LivroCRUD livroCRUD;
private ListView lvPrincipal;
private LivroAdapter livroAdapter;
private List<Livro> lista;

private void getLivros() throws Exception {
    //armazena os dados da busca em uma lista temporaria
    List<Livro> tempLista = livroCRUD.buscarTodos();

    // Cria a lista, caso ela não esteja criada
    if (lista == null)
        lista = new ArrayList<Livro>();

    // Limpa a sua lista de livros e adiciona todos os registros da lista temporária
    lista.clear();
    lista.addAll(tempLista);

    // Se o adapter for null, cria o adapter, se não notifica que seu dataset teve alteração
    if(livroAdapter == null){
        livroAdapter = new LivroAdapter(this, lista);
        lvPrincipal.setAdapter(livroAdapter);
    }else {
        livroAdapter.notifyDataSetChanged();
    }
}

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

    lvPrincipal = (ListView) findViewById(R.id.lvPrincial);
    try {
        this.getLivros();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this, "Não foi possivel carregar a lista.", Toast.LENGTH_SHORT).show();
    }
}

@Override
protected void onResume() {
    super.onResume();try {
        this.getLivros();
    } catch (Exception e) {
        e.printStackTrace();
        Toast.makeText(this, "Não foi possivel carregar a lista.", Toast.LENGTH_SHORT).show();
    }

}

The friend @Ramaral gave me the hint of using notifyDataSetChanged(); , creating a method on my adapter but I'm not getting it.

Adapter.

public class LivroAdapter extends BaseAdapter {
private Context context;
private List<Livro> lista;

public LivroAdapter(Context context, List<Livro> lista) {
    this.context = context;
    this.lista = lista;
}

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

@Override
public Object getItem(int arg0) {
    return lista.get(arg0);
}

@Override
public long getItemId(int arg0) {
    return lista.get(arg0).getId();
}

@Override
public View getView(final int position, View convertView, ViewGroup parent) {
    Livro livro = lista.get(position);
    final int auxPosition = position;

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(context.LAYOUT_INFLATER_SERVICE);
    final View layout = inflater.inflate(R.layout.item_lista, null);

    TextView titulo = (TextView) layout.findViewById(R.id.tvTitulo);
    titulo.setText(lista.get(position).getTitulo());

    TextView autor = (TextView) layout.findViewById(R.id.tvAutor);
    autor.setText(lista.get(position).getAutor());

    TextView editora = (TextView) layout.findViewById(R.id.tvEditora);
    editora.setText(lista.get(position).getEditora());

    //BOTÃO ATUALIZAR
    Button btnAtualizar = (Button) layout.findViewById(R.id.btnChamaAtualizar);
    btnAtualizar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Intent intent = new Intent(context, AddUpdateActivity.class);
            intent.putExtra("titulo", lista.get(auxPosition).getTitulo());
            intent.putExtra("autor", lista.get(auxPosition).getAutor());
            intent.putExtra("editora", lista.get(auxPosition).getEditora());
            intent.putExtra("_id", lista.get(auxPosition).getId());
            context.startActivity(intent);

        }
    });

    //BOTAO DELETAR
    Button btnDeletar = (Button) layout.findViewById(R.id.btnDeletar);
    btnDeletar.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            LivroCRUD livroCRUD = new LivroCRUD(context);
            try {
                livroCRUD.deletar(lista.get(auxPosition));
                layout.setVisibility(View.GONE);
            } catch (Exception e) {
                e.printStackTrace();
                Toast.makeText(context, "Não foi possivel excluir!!!!!", Toast.LENGTH_SHORT).show();
            }
        }
    });

    return layout;
}

//METODO PARA ATUALIZAR LISTA APÓS ALTERAÇÕES
public void atualizaLista(List<Livro> lista){
    this.lista = lista;
    notifyDataSetChanged();
}

}

I can not call the atualizaLista method on my onResume .

    
asked by anonymous 27.02.2016 / 14:08

1 answer

3

First of all, declare the adapter and list in a variable and make sure it is no longer created.

private LivroAdapter livroAdapter;
private List<Livro> listaLivro;

private void getLivros() {
    // Aramazena os dados da busca em uma lista temporária
    List<Livro> tempList = livroCRUD.buscarTodos();

    // Cria a lista, caso ela não esteja criada
    if (listaLivro == null)
       listaLivro = new ArrayList<Livro>();

    // Limpa a sua lista de livros e adiciona todos os registros da lista temporária
    listaLivro.clear();
    listaLivro.addAll(tempList);

    // Se o adapter for null, cria o adapter, se não notifica que seu dataset teve alteração (No seu caso a lista de livros).
    if (livroAdapter == null) {
        livroAdapter = new LivroAdapter(this, listaLivro);
        lvPrincipal.setAdapter(livroAdapter);
    } else {
        livroAdapter.notifyDataSetChanged();
    }
}

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

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

    lvPrincipal = (ListView) findViewById(R.id.lvPrincial);
}

Put this code in your MainActivity .

Remember that you do not need to create the adapter multiple times to update your list, it already contains a reference to your list of books, so just update this list and notify the Adapter to process the update.

    
27.02.2016 / 15:33