update Listview using notifyDataSetChanged();

Asked

Viewed 5,404 times

1

I have two screens, one with a main list loaded with BD data and one of registration, after inserting some data, the registration screen closes and goes back to the main list, I’m having trouble updating the ListView of the main screen. I did it that works, but I’m not sure if it’s right.

EDIT: change of main Activity

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();
    }

}

Friend @Ramaral gave me the tip to use the notifyDataSetChanged();, creating a way into 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’t call the method atualizaLista in my onResume.

  • Apparently right, the function is public, you import your extension of the Adapter Livroadapter, bookAdapter.updateList( list ); onResume doesn’t work? What problem are you having exactly?

  • Call it that way fires a Nullpointerexception.

  • 1

    Looking at this edited code, you haven’t started your CRUD book anywhere in Mainactivity, so it has null value when you try to call the search( );

  • it is true @Matheusdemello had let go, now this working.

1 answer

5


First of all, declare Adapter and the list in a variable and make sure it is not already 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 don’t need to create Adapter multiple times to update your list, it already contains a reference to your book list, so just update this list and notify Adapter to process the update.

Browser other questions tagged

You are not signed in. Login or sign up in order to post.