Solucionado (ver solução)
Solucionado
(ver solução)
8
respostas

Passar item selecionado entre activities

Me distanciei um pouco das aulas e estou implementando umas coisas por conta própria. No momento, estou com dúvida de fazer com que o item clicado nessa tela

http://prntscr.com/eyjdzo

apareça selecionado nessa tela

http://prntscr.com/eyjecw

8 respostas

Olá João,

Uma funcionalidade bem similar a que você descreveu é explicada na aula 5 desse mesmo curso:

https://cursos.alura.com.br/course/android-studio/task/11366

Eu consegui passar a posição do item clicado nessa activity

http://prntscr.com/eyjdzo

mas o que quero é que quando ele carregue essa

http://prntscr.com/eyjecw

ele já esteja marcado.

Ok, se você já tem o item na segunda tela, basta pegar a view do item selecionado (com findViewById) e chamar o método setChecked(true) nessa view.

Poderia deixar um exemplo em código?

package br.com.softmedia.agenda;

import android.app.AlertDialog;
import android.app.Dialog;
import android.content.Context;
import android.content.DialogInterface;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.SparseBooleanArray;
import android.view.ActionMode;
import android.view.ContextMenu;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.AbsListView;
import android.widget.AdapterView;
import android.widget.ArrayAdapter;

import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.List;
import java.util.zip.Inflater;

import br.com.softmedia.agenda.dao.AlunoDAO;
import br.com.softmedia.agenda.modelo.Aluno;

public class DeleteMultiplos extends AppCompatActivity {

    private ArrayList<Aluno> alunos_selecionados = new ArrayList<>();
    private ListView listaAlunos_del;
    private ArrayAdapter<Aluno> adapter;
    private AlunoDAO alunoDAO;
    private int pos = 0;
    private int posicao;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_delete_multiplos);
        listaAlunos_del = (ListView) findViewById(R.id.lista_alunos_del);
        posicao = getIntent().getIntExtra("posicao", pos);

    }

    @Override
    protected void onResume() {
        super.onResume();
        alunoDAO = new AlunoDAO(DeleteMultiplos.this);
        final List<Aluno> alunos = alunoDAO.listaAlunos();
        alunoDAO.close();
        carregaListachk();
        listaAlunos_del.setItemChecked(posicao, true);

        listaAlunos_del.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
            @Override
            public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {



                final int count = listaAlunos_del.getCheckedItemCount();
                if (count == 1) {
                    mode.setTitle(count + " Selecionado");
                } else {
                    mode.setTitle(count + " Selecionados");
                }



                if (checked) {

                    alunos_selecionados.add(alunos.get(position));
                } else {
                    alunos_selecionados.remove(alunos.get(position));
                }

            }

            @Override
            public boolean onCreateActionMode(ActionMode mode, Menu menu) {
                MenuInflater inflater = mode.getMenuInflater();
                inflater.inflate(R.menu.menu_delete, menu);

                return true;
            }

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

            @Override
            public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
                switch (item.getItemId()) {
                    case R.id.menu_delete_ok:

                        onCreateDialog().show();


                        break;
                }

                return false;
            }

            @Override
            public void onDestroyActionMode(ActionMode mode) {

            }
        });
    }

    private void carregaListachk() {
        alunoDAO = new AlunoDAO(DeleteMultiplos.this);
        final List<Aluno> alunos = alunoDAO.listaAlunos();
        alunoDAO.close();


        adapter = new ArrayAdapter<>(DeleteMultiplos.this, android.R.layout.simple_list_item_multiple_choice, alunos);
        //list_view.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);
        listaAlunos_del.setAdapter(adapter);

        listaAlunos_del.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL);


    }


    public Dialog onCreateDialog() {
        // Use the Builder class for convenient dialog construction
        AlertDialog.Builder builder = new AlertDialog.Builder(DeleteMultiplos.this);
        builder.setMessage(R.string.del_dialog)
                .setPositiveButton(R.string.del_confirm, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {

                        AlunoDAO alunoDAO = new AlunoDAO(DeleteMultiplos.this);
                        alunoDAO.deletaMultiplos(alunos_selecionados);
                        alunoDAO.close();

                        finish();

                    }
                })
                .setNegativeButton(R.string.del_cancel, new DialogInterface.OnClickListener() {
                    public void onClick(DialogInterface dialog, int id) {
                        onResume();
                    }
                });
        // Create the AlertDialog object and return it
        return builder.create();
    }


}

Estou fazendo desse jeito, com o

listaAlunos_del.setItemChecked(posicao, true);

porém a aplicação para de responder.

Olá João,

Quando a aplicação para de responder, o Android Studio imprime a stack trace do erro no console. Copia e cola aqui essa stack trace pra gente ter uma ideia melhor do que está gerando o erro.

04-27 01:26:23.783 5312-5349/? E/Surface: getSlotFromBufferLocked: unknown buffer: 0xaa091770
04-27 01:26:23.842 5312-5312/? D/AndroidRuntime: Shutting down VM
04-27 01:26:23.842 5312-5312/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                 Process: agenda.softmedia.com.br.teste, PID: 5312
                                                 java.lang.RuntimeException: Unable to resume activity {agenda.softmedia.com.br.teste/br.com.softmedia.agenda.DeleteMultiplos}: java.lang.IllegalStateException: AbsListView: attempted to start selection mode for CHOICE_MODE_MULTIPLE_MODAL but no choice mode callback was supplied. Call setMultiChoiceModeListener to set a callback.
                                                     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3103)
                                                     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134)
                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481)
                                                     at android.app.ActivityThread.-wrap11(ActivityThread.java)
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344)
                                                     at android.os.Handler.dispatchMessage(Handler.java:102)
                                                     at android.os.Looper.loop(Looper.java:148)
                                                     at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                     at java.lang.reflect.Method.invoke(Native Method)
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)
                                                  Caused by: java.lang.IllegalStateException: AbsListView: attempted to start selection mode for CHOICE_MODE_MULTIPLE_MODAL but no choice mode callback was supplied. Call setMultiChoiceModeListener to set a callback.
                                                     at android.widget.AbsListView.setItemChecked(AbsListView.java:1032)
                                                     at br.com.softmedia.agenda.DeleteMultiplos.carregaListachk(DeleteMultiplos.java:125)
                                                     at br.com.softmedia.agenda.DeleteMultiplos.onResume(DeleteMultiplos.java:54)
                                                     at android.app.Instrumentation.callActivityOnResume(Instrumentation.java:1258)
                                                     at android.app.Activity.performResume(Activity.java:6312)
                                                     at android.app.ActivityThread.performResumeActivity(ActivityThread.java:3092)
                                                     at android.app.ActivityThread.handleResumeActivity(ActivityThread.java:3134) 
                                                     at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2481) 
                                                     at android.app.ActivityThread.-wrap11(ActivityThread.java) 
                                                     at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1344) 
                                                     at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                     at android.os.Looper.loop(Looper.java:148) 
                                                     at android.app.ActivityThread.main(ActivityThread.java:5417) 
                                                     at java.lang.reflect.Method.invoke(Native Method) 
                                                     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                                                     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
04-27 01:26:23.843 2415-2557/system_process W/ActivityManager:   Force finishing activity agenda.softmedia.com.br.teste/br.com.softmedia.agenda.DeleteMultiplos
04-27 01:26:23.846 2415-2557/system_process W/ActivityManager:   Force finishing activity agenda.softmedia.com.br.teste/br.com.softmedia.agenda.ListaAlunosActivity
solução!

Olá João,

A mensagem de erro está informando que é necessário especificar um MultiChoiceModeListener para tratar os eventos de seleção de itens na sua lista. Para isso você deve invocar o método setMultiChoiceModeListener(...) passando como parâmetro uma implementação de um listener desse tipo.

Não tenho muita experiência com esse comportamento da ListView mas achei esse post no stack overflow que tem um pouco mais de informação para que você possa usar como referência na hora de implementar o listener.

http://stackoverflow.com/questions/10251095/change-listview-choicemode-from-singlechoice-to-multiplechoicemodal