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
apareça selecionado nessa tela
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
apareça selecionado nessa tela
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
mas o que quero é que quando ele carregue essa
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
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.