7
respostas

Deletar Item

Boa noite. Tenho um app que ao clicar aparece um menu de ação contextual simples e uma das opções é deletar. Abaixo o método para a ação contextual

@Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
            AdapterView.AdapterContextMenuInfo info;

            info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

            Extintores extintores = (Extintores) listViewExtintores.getSelectedItemPosition();

            switch (item.getItemId()){
                case R.id.deleta_item:
                    excluirExtintor(extintores);
                    mode.finish();
                    return true;
                case R.id.altera_item:
                    //excluir();
                    mode.finish();//Fecha o menu apos clicar no icone
                    return true;
                case R.id.servicos_item:
                    Intent intent_servicos = new Intent(getApplicationContext(), ServicosActivity.class);
                    startActivity(intent_servicos);
                    mode.finish();
                    return true;
                default:
                    return false;
            }
        }

Ao selecionar deletar ele redireciona ao seguinte método.

private void excluirExtintor(final Extintores extintores){
        String mensagem = getString(R.string.deseja_realmente_apagar)
                + "\n";

        DialogInterface.OnClickListener listener =
                new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {

                        switch(which){
                            case DialogInterface.BUTTON_POSITIVE:

                                try {
                                    DatabaseHelper conexao =
                                            DatabaseHelper.getInstance(PrincipalActivity.this);

                                    conexao.getExtintoresDAO().delete(extintores);

                                    listaAdapter.remove(extintores);

                                } catch (SQLException e) {
                                    e.printStackTrace();
                                }

                                break;
                            case DialogInterface.BUTTON_NEGATIVE:

                                break;
                        }
                    }
                };

        UtilsGUI.confirmaAcao(PrincipalActivity.this, mensagem, listener);
    }

A minha dificuldade está em ao chamar o método deletar como vou passar a posição do item selecionado?

7 respostas

Você exclui a lista de extintores ?

A lista vocês percorrendo ela ao chamar o método no seu Dao ?

Boa tarde. Neste caso eu queria excluir um item especifico da lista, ao selecionar ele abre o menu de contexto na barra e ao clicar na imagem de deletar ele teria que enviar a posição ou o ID do item selecionado.

Boa noite, segue o código.

public class PrincipalActivity extends AppCompatActivity {

    private ListView listViewExtintores;
    private ArrayAdapter<Extintores> listaAdapter;
    private ActionMode actionMode;
    private int posicaoSelecionada = -1;
    private View viewSelecionada;
    private static final int REQUEST_NOVO_EXTINTOR = 1;
    private static final int REQUEST_ALTERAR_EXTINTOR = 2;


    //MENU ACAO CONTEXTUAL SIMPLES INICIO
    private ActionMode.Callback mActionModeCallback = new ActionMode.Callback() {
        @Override
        public boolean onCreateActionMode(ActionMode mode, Menu menu) {
            MenuInflater inflater = mode.getMenuInflater();
            inflater.inflate(R.menu.item_selecionado, menu);
            return true;
        }

        @Override
        public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
            return false;
        }



        @Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

            AdapterView.AdapterContextMenuInfo info;

            info = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();

            //Extintores extintores = (Extintores) listViewExtintores.getPositionForView();

            switch (item.getItemId()){
                case R.id.deleta_item:

                    //excluirExtintor(extintores);
                    //Toast.makeText(PrincipalActivity.this, Integer.toString(posicaoSelecionadaEX), Toast.LENGTH_LONG).show();
                    //listaAdapter.remove(listViewExtintores.getItemAtPosition(posicaoSelecionada));
                    mode.finish();
                    return true;
                case R.id.altera_item:
                    //excluir();
                    mode.finish();//Fecha o menu apos clicar no icone
                    return true;
                case R.id.servicos_item:
                    Intent intent_servicos = new Intent(getApplicationContext(), ServicosActivity.class);
                    startActivity(intent_servicos);
                    mode.finish();
                    return true;
                default:
                    return false;
            }
        }


        @Override
        public void onDestroyActionMode(ActionMode mode) {
            if(viewSelecionada != null){
                viewSelecionada.setBackgroundColor(Color.TRANSPARENT);
            }

            actionMode = null;
            viewSelecionada = null;

            listViewExtintores.setEnabled(true);
        }
    };

    //MENU ACAO CONTEXTUAL SIMPLES FINAL

Boa tarde, não sei se já conseguiu o que queria, mas pelo que eu entendi você quer simplesmente pegar a posição na listView do item clicado e passar para o método excluir.

Tendo o MenuItem é só fazer o seguinte:

AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
int posicaoClicada = menuInfo.position;
excluirExtintorNa(posicaoClicada)

Boa tarde Gilmar, obrigado pelo retorno, fiz o que foi passado

@Override
        public boolean onActionItemClicked(ActionMode mode, MenuItem item) {

            AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo) item.getMenuInfo();
            int posicaoClicada = menuInfo.position;

            switch (item.getItemId()){
                case R.id.deleta_item:
                    //excluirExtintor(posicaoClicada);
                    Toast.makeText(PrincipalActivity.this, posicaoClicada, Toast.LENGTH_LONG).show();
                    //listaAdapter.remove(listViewExtintores.getItemAtPosition(posicaoSelecionada));
                    mode.finish();
                    return true;
                case R.id.altera_item:
                    //excluir();
                    mode.finish();//Fecha o menu apos clicar no icone
                    return true;
                case R.id.servicos_item:
                    Intent intent_servicos = new Intent(getApplicationContext(), ServicosActivity.class);
                    startActivity(intent_servicos);
                    mode.finish();
                    return true;
                default:
                    return false;
            }
        }

Peguei a posicaoClicada e tentei imprimir, mas, gerou um error.

06-09 18:09:42.019 5687-5687/com.example.affonso.projeto_2_extintores E/AndroidRuntime: FATAL EXCEPTION: main Process: com.example.affonso.projeto_2_extintores, PID: 5687 java.lang.NullPointerException: Attempt to read from field 'int android.widget.AdapterView$AdapterContextMenuInfo.position' on a null object reference at com.example.affonso.projeto_2_extintores.activity.PrincipalActivity$1.onActionItemClicked(PrincipalActivity.java:65)

Hmm, o seu MenuInfo está vindo null no método onActionItemClicked então né.

Para te falar a verdade nunca usei o ActionMode para inflar menu de contexto, sempre usei o método onCreateContextMenu.

Se não tiver nada que te prenda ao ActionMode, tente usar o onCreateContextMenu para inflar seu menu de contexto e o onContextItemSelected para tratar o click no item selecionado. Algo como:

@Override
public void onCreateContextMenu(ContextMenu menu, View v, ContextMenu.ContextMenuInfo menuInfo) {
    super.onCreateContextMenu(menu, v, menuInfo);
    menu.add(Menu.NONE, 1, Menu.NONE, "Editar");
    menu.add(Menu.NONE, 2, Menu.NONE, "Deletar");
}
@Override
 public boolean onContextItemSelected(MenuItem item) {
    AdapterView.AdapterContextMenuInfo menuInfo = (AdapterView.AdapterContextMenuInfo)
    item.getMenuInfo();
    int posicaoClicada = menuInfo.position;

    switch (item.getItemId()) {
        case 1: {
            editaExtintor(posicaoClicada);
            break;
        }

        case 2: {
            deletaExtintor(posicaoClicada);
            break;
        }
    }

    return super.onContextItemSelected(item);
}

Também tem um ótimo artigo no blog da Alura, escrito pelo Alex Felipe, exclusivamente ensinando a criar um menu de contexto, segue o link:

http://blog.alura.com.br/criando-menu-de-contexto-no-android-context-menu/

Boa noite.

Obrigado Gilmar, infelizmente o projeto tem que usar esse tipo de menu, acredito que por ser um pouco mais complexo kkk.. mas obrigado pela ajuda.