How to update Listviem after deleting an item?

Asked

Viewed 705 times

5

When I click on an item of mine Listview, i open a dialog with 3 buttons (Edit, Finish and Delete).
By clicking delete, I would like to make the Listview be updated.

Man Adapter is in a separate class and requires that after deleting a record in the database the list is updated.
I’ve used the method notifyDataSetChanged(), but it’s not working.

Below is the main class where the Listview and also the class Adapter.

public class FragmentHome extends BaseFragment {
    private Context mContext;
    public ListView lvAtvidades;
    private View mView;
    private LinearLayout llmenupopup;
    private ArrayList<HMAux> data;
    private CustomAtividadeAdapter adapter_atividades;
    private int usuarioID;

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        //Setando a View com o layout do Fragment
        mView = inflater.inflate(R.layout.fragment_home, null);

        //Métodos padrão
        inicializaVariavel();
        inicializaAcao();

        //Retornando a View
        return mView;
    }

    //Método responsável por inicializar todos os componentes
    private void inicializaVariavel() {
        mContext = getContext();
        lvAtvidades = (ListView) mView.findViewById(R.id.fragment_home_lvAtividades);
    }

    //Método responsável pelas ações do Fragment
    private void inicializaAcao() {
        //Origem da informação, buscando os dados da Classe HMAux
        String[] from = {HMAux.TEXTO_1, HMAux.TEXTO_2, HMAux.TEXTO_3};

        //Representação aonde os dados serão exibidos
        int[] to = {R.id.item_atividade_iv_icone, R.id.item_atividade_tv_titulo, R.id.item_atividade_tv_descricao};

        //Chama o método que busca os dados
        buscaListaAtividades();

        //
        adapter_atividades = new CustomAtividadeAdapter(mContext,  R.layout.item_atividade, data);
        lvAtvidades.setAdapter(adapter_atividades);
        llmenupopup = (LinearLayout) mView.findViewById(R.id.item_atividade_ll_menu);
    }

    //Método responsável por buscar os dados
    private void buscaListaAtividades() {
        //Buscando o ID do usuário do Shared Preferences
        SharedPreferences mSharedPreferences = this.getActivity().getSharedPreferences(Constantes.PREFS, Context.MODE_PRIVATE);
        usuarioID = mSharedPreferences.getInt(Constantes.CODIGO, -1);

        //Inicializando e chamando o método que retorna a lista de atividades
        AtividadeDao mAtividadeDao = new AtividadeDao(mContext);
        data = mAtividadeDao.obterlistaAtividades(usuarioID, 2, 1);
    }

    @Override
    public void onStart() {
        super.onStart();

        //Chama o método para inicializar novamente as variaveis
        inicializaVariavel();
        inicializaAcao();
    }

    @Override
    public void onResume() {
        super.onResume();

        //Origem da informação, buscando os dados da Classe HMAux
        String[] from = {HMAux.TEXTO_1, HMAux.TEXTO_2, HMAux.TEXTO_3};

        //Representação aonde os dados serão exibidos
        int[] to = {R.id.item_atividade_iv_icone, R.id.item_atividade_tv_titulo, R.id.item_atividade_tv_descricao};

        //Chama o método que busca os dados
        buscaListaAtividades();

        //
        adapter_atividades = new CustomAtividadeAdapter(mContext,  R.layout.item_atividade, data);
        lvAtvidades.setAdapter(adapter_atividades);
        llmenupopup = (LinearLayout) mView.findViewById(R.id.item_atividade_ll_menu);
    }
}

Adapter:

public class CustomAtividadeAdapter extends BaseAdapter {
    private LayoutInflater inflater;
    private ArrayList<HMAux> data;
    private int resource;
    private LinearLayout llmenupopup;
    private ImageView ivMenupopup;
    private Context mContext;

    //
    public CustomAtividadeAdapter(Context context, int resource, ArrayList<HMAux> data){
        this.data = data;
        this.resource = resource;
        this.inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    }

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

    @Override
    public Object getItem(int position) {
        return data.get(position);
    }

    @Override
    public long getItemId(int position) {
        HMAux item = data.get(position);
        return Long.parseLong(item.get(HMAux.ID));
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        if (convertView == null) {
            convertView = inflater.inflate(resource, parent, false);
        }

        //Grava o context do aplicativo
        mContext = convertView.getContext();

        //Inicializando os componentes da item_atividade.xml
        ImageView ivIcone = (ImageView) convertView.findViewById(R.id.item_atividade_iv_icone);
        final TextView tvID = (TextView) convertView.findViewById(R.id.item_atividade_tv_id);
        TextView tvNome = (TextView) convertView.findViewById(R.id.item_atividade_tv_titulo);
        TextView tvDetalhes = (TextView) convertView.findViewById(R.id.item_atividade_tv_descricao);

        //
        HMAux item = data.get(position);

        //
        //ivIcone.setImageResource(R.drawable.ic_menu_camera);
        tvID.setText(item.get(HMAux.ID));
        tvNome.setText(item.get(HMAux.TEXTO_1));
        tvDetalhes.setText(item.get(HMAux.TEXTO_2));

        //Inicializa os componentes de click
        llmenupopup = (LinearLayout) convertView.findViewById(R.id.item_atividade_ll_menu);
        ivMenupopup = (ImageView) convertView.findViewById(R.id.item_atividade_iv_menupopup);

        //Método de click do popup da listwiew
        llmenupopup.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {

                //Menu popup
                ivMenupopup.setImageResource(R.drawable.ic_menupopup);
                final PopupMenu mPopupMenu = new PopupMenu(mContext, v);
                mPopupMenu.setGravity(Gravity.RIGHT);
                mPopupMenu.getMenuInflater().inflate(R.menu.list_atividades, mPopupMenu.getMenu());

                //Customização da opção Editar do List Atividades
                MenuItem mMenuItemEditar = mPopupMenu.getMenu().getItem(0);
                SpannableString spannableEdit = new SpannableString(mMenuItemEditar.getTitle());
                spannableEdit.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(R.color.Preto)), 0, spannableEdit.length(), 0);
                mMenuItemEditar.setTitle(spannableEdit);

                //Customização da opção Finalizar do List Atividades
                MenuItem mMenuItemFinalizar = mPopupMenu.getMenu().getItem(1);
                SpannableString spannableFinalizar = new SpannableString(mMenuItemFinalizar.getTitle());
                spannableFinalizar.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(R.color.Preto)), 0, spannableFinalizar.length(), 0);
                mMenuItemFinalizar.setTitle(spannableFinalizar);

                //Customização da opção Excluir do List Atividades
                MenuItem mMenuItemExcluir = mPopupMenu.getMenu().getItem(2);
                SpannableString spannableExcluir = new SpannableString(mMenuItemExcluir.getTitle());
                spannableExcluir.setSpan(new ForegroundColorSpan(mContext.getResources().getColor(R.color.Preto)), 0, spannableExcluir.length(), 0);
                mMenuItemExcluir.setTitle(spannableExcluir);

                //Métodos das opções do popoup menu
                mPopupMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    @Override
                    public boolean onMenuItemClick(MenuItem item) {
                        switch (item.getItemId()) {
                            case R.id.list_atividades_editar:
                                //Cria e inicializa Activity TelaEditarAtividade.class
                                Intent mIntent = new Intent(mContext, TelaEditarAtividade.class);
                                mIntent.putExtra(Constantes.TIPO, 1);
                                mIntent.putExtra(Constantes.VALOR, Integer.valueOf(tvID.getText().toString()));
                                mContext.startActivity(mIntent);

                                break;
                            case R.id.list_atividades_finalizar:
                                //Cria e inicializa objeto Atividade
                                Atividade mAtividade = new Atividade();
                                mAtividade.setCodigo(Integer.valueOf(tvID.getText().toString().trim()));
                                mAtividade.setConcluida(true);
                                mAtividade.setCodigo_statusatividade(2);

                                //Executa atualização do banco de dados
                                AtividadeDao mAtividadeDao = new AtividadeDao(mContext);
                                mAtividadeDao.finalizarAtividade(mAtividade);

                                notifyDataSetChanged();

                                break;
                            case R.id.list_atividades_excluir:

                                //Criando e inicializando Alert Dialog
                                AlertDialog.Builder mAlerBuilder = new AlertDialog.Builder(mContext);
                                mAlerBuilder.setTitle(null);
                                mAlerBuilder.setMessage("Caro usuário você realmente deseja excluir essa atividade?");
                                mAlerBuilder.setCancelable(false);

                                //Método do botão negativo do Alert Dialog
                                mAlerBuilder.setNegativeButton("CANCELAR", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        dialog.cancel();
                                        dialog.dismiss();
                                    }
                                });

                                //Método do botão positivo do Alert Dialog
                                mAlerBuilder.setPositiveButton("OK", new DialogInterface.OnClickListener() {
                                    @Override
                                    public void onClick(DialogInterface dialog, int which) {
                                        //Cria e inicializa objeto atividade com os dados que sera deletado
                                        Atividade mAtividade = new Atividade();
                                        mAtividade.setCodigo(Integer.valueOf(tvID.getText().toString()));
                                        mAtividade.setExcluida(true);
                                        mAtividade.setCodigo_statusatividade(3);

                                        //Delete atividade
                                        AtividadeDao mAtividadeDao = new AtividadeDao(mContext);
                                        mAtividadeDao.apagarAtividade(mAtividade);

                                        //Aqui deve ser atualizado a ListView
                                        notifyDataSetChanged();
                                    }
                                });

                                //Demonstra mensagem Alert Dialog
                                mAlerBuilder.show();
                                break;
                            default:
                                break;
                        }

                        return false;
                    }
                });

                //Inicializa Poupop
                mPopupMenu.setOnDismissListener(new PopupMenu.OnDismissListener() {
                    @Override
                    public void onDismiss(PopupMenu menu) {
                        ivMenupopup.setImageResource(R.drawable.ic_menupopup);
                    }
                });

                //Demonstra Menu Popup
                mPopupMenu.show();
            }
        });

        //
        return convertView;
    }
}

1 answer

5


The Arraylist that the Adapter usa is not directly connected to the database: changes made to the database are not automatically passed on to the Array.

Before using notifyDataSetChanged() these amendments must be reflected in the Arraylist data.

Has two possibilities:

1 - Delete this item from Array:

    data.remove(position);
    notifyDataSetChanged();

2 - Reread updated data from the bank:

    data = mAtividadeDao.obterlistaAtividades(?,?,?);
    //Substitua os ? pelos valores correctos
    notifyDataSetChanged();

Or instead of an Arrayadapter using a Cursoradapter.

  • Hello Ramaral, thank you for returning the element date is not in the Customisadeadapter class so I can not use either of the two solutions.

  • What do you mean, it’s not?

  • 1

    Sorry Ramaral said nonsense, thanks for the help worked correctly.

Browser other questions tagged

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