How to update ListViem after deleting an item?

5

When I click on an item in my ListView , I open a dialog with 3 buttons (Edit, Finish, and Delete). When I click delete, I would like to have the ListView updated.

My Adapter is in a separate class and I need to update the list after deleting a record in the database. I have already used the notifyDataSetChanged() method, but it is not working.

Below is the main class where the ListView and the Adapter class are created.

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;
    }
}
    
asked by anonymous 21.03.2016 / 13:29

1 answer

5

The ArrayList that the adapter uses is not directly linked to the database: Changes made to the database are not automatically passed on to the Array.

Before using notifyDataSetChanged() you will have to pass those changes on the ArrayList data .

You have two possibilities:

1 - Delete this item from Array :

    data.remove(position);
    notifyDataSetChanged();

2 - Reread the updated bank data:

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

Or instead of an ArrayAdapter use a CursorAdapter.

    
21.03.2016 / 14:24