Pegar item de ListView e mostrar em campo de outra tela
30 respostas
F
fbrigatt
Boa noite meus amigos,
Estou com o seguinte problema:
Tenho uma classe que se chama BuscaCliente e nela tem uma lista. Quero clicar num item da lista e mandar para outra tela o nome e id. A tela chama CarrosCliente. O código abaixo chama a tela ao clicar, mas manda os dados em branco.
// Clicar em item da lista e mostra nos campos da tela de cadastro@OverrideprotectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){super.onListItemClick(l,v,position,id);Intentintent=newIntent(this,CarrosCliente.class);intent.putExtra(DbAdapter.KEY_ID,id);startActivity(intent);// startActivityForResult(intent, 1);}
Por que você tá chamando startActivity duas vezes? Ou chama o startActivity, ou chama o startActivityForResult.
Você imprimiu os valores do id no método pra garantir que está sendo enviado?
Como está pegando estes valores na activity que os recebe?
F
fbrigatt
Ta duplicado, colei errado. Mas como faria isso, não sei como fazer…
O correto seria:
// Clicar em item da lista e mostra nos campos da tela de cadastro@OverrideprotectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){super.onListItemClick(l,v,position,id);Intentintent=newIntent(this,CarrosCliente.class);intent.putExtra(DbAdapter.KEY_ID,id);startActivityForResult(intent,1);}
Poste onde você está recebendo estes valores também (e debugue lá tb!).
F
fbrigatt
Como testo isso, é só rodar normalmente?
W
wagnerfrancisco
Sim. Você tá usando eclipse com o plugin ADT? Os logs serão exibidos numa aba chamada LogCat. Se ela não estiver aparecendo, aperte Ctrl + 3 e digite LogCat.
E poste o código onde você recebe o id na classe CarrosCliente pra nós vermos também!
F
fbrigatt
Ta pegando o id, rodei e apareceu no rodapé do eclipse.
W
wagnerfrancisco
Se está pegando corretamente, seu problema é na hora de jogar este id na tela. Posta o código pra vermos melhor. E lembre-se que você está passando apenas o id (e não o nome, como vc mencionou no início), talvez este seja o problema.
Agora nem chama mais a tela da erro ao clicar no item da lista na tela anterior.
W
wagnerfrancisco
Esse código que você colou está em qual método? Se não for muito grande, coloca a classe inteira.
F
fbrigatt
Fiz assim na classe CarrosCliente, onde é pra aparecer os dados da tela anterior.
F
fbrigatt
Classe BuscaClientes:
packagebr.com.oficinavittorazo;importandroid.app.ListActivity;importandroid.content.Intent;importandroid.database.Cursor;importandroid.os.Bundle;importandroid.text.Editable;importandroid.text.TextWatcher;importandroid.util.Log;importandroid.view.View;importandroid.widget.EditText;importandroid.widget.ImageButton;importandroid.widget.ListView;importandroid.widget.SimpleCursorAdapter;publicclassBuscaClientesextendsListActivity{publicImageButtonvoltar;publicDbAdapterdb;privateEditTextProcurar;@OverrideprotectedvoidonCreate(Bundleicicle){// Início do método onCreatesuper.onCreate(icicle);setContentView(R.layout.busca_cliente_layout);db=newDbAdapter(this);db.open();Cursorclientes=db.getTodosClientes();clientes.moveToFirst();Procurar=(EditText)findViewById(R.id.etProcurar);Procurar.requestFocus();carregarLista();Procurar.addTextChangedListener(newTextWatcher(){@OverridepublicvoidonTextChanged(CharSequences,intstart,intbefore,intcount){CarregarEncontrados();//Carrega o listview com os itens encontradoslv.setAdapter(newArrayAdapter<String>(CadastrarCarros.this,android.R.layout.simple_list_item_1,agenda_Encontrados));*/carregarLista();}@OverridepublicvoidbeforeTextChanged(CharSequences,intstart,intcount,intafter){// TODO Auto-generated method stub}@OverridepublicvoidafterTextChanged(Editables){// TODO Auto-generated method stub}});voltar=(ImageButton)findViewById(R.id.bt_voltar);voltar.setOnClickListener(newView.OnClickListener(){@OverridepublicvoidonClick(Viewv){// Evento ao clicar no botão VoltarsetResult(RESULT_CANCELED);// Fecha a tela de Cadastro e Volta para a Principalfinish();}});}// Clicar em item da lista e mostra nos campos da tela de cadastro@OverrideprotectedvoidonListItemClick(ListViewl,Viewv,intposition,longid){super.onListItemClick(l,v,position,id);Log.d("BuscaCliente",String.valueOf(id));// fazendo logIntentintent=newIntent(this,CarrosCliente.class);intent.putExtra(DbAdapter.KEY_ID,id);startActivityForResult(intent,1);}privatevoidcarregarLista(){StringnomeString=Procurar.getText().toString();db.open();// Cursor clientes = db.getTodosClientes();Cursorclientes=db.getClientePorNome(nomeString);clientes.moveToFirst();SimpleCursorAdapteradapter=newSimpleCursorAdapter(this,android.R.layout.two_line_list_item,clientes,newString[]{DbAdapter.KEY_NOME,DbAdapter.KEY_ID},newint[]{android.R.id.text1,android.R.id.text2});setListAdapter(adapter);db.close();// Setar lista na mão//String[] items = new String[] {"Carro", "Trabalho", "Faculdade"};//ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, items);}@OverrideprotectedvoidonActivityResult(intrequestCode,intresultCode,Intentdata){super.onActivityResult(requestCode,resultCode,data);if(requestCode==1&&resultCode==RESULT_OK)carregarLista();}}
Aparentemente este código esta correto. Para termos certeza, imprima o mId nestes dois lugares:
publicclassCarrosClienteextendsActivity{privatelongmId;privateTextViewIdNome;// private EditText nome;// private ImageButton salvar, pesquisar, limpar, voltar;privateDbAdaptermDb;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.cadastro_carros_cliente_layout);mDb=newDbAdapter(this);mId=getIntent().getLongExtra(DbAdapter.KEY_ID,0);Log.d("CarrosCliente","mId: "+mId);//aquiIdNome=(TextView)findViewById(R.id.IdNome);// nome = (EditText) findViewById(R.id.editText_nome);mDb.open();Cursorcliente=mDb.getCliente(mId);if(mId>0){IdNome.setText(" "+cliente.getString(cliente.getColumnIndex("_id")));Log.d("CarrosCliente","mId: "+mId);// e aqui// nome.setText(cliente.getString(cliente.getColumnIndex(DbAdapter.KEY_NOME)));}}}
Você comentou que estava dando algum erro. Quando dá erro aparece a exceção lá no LogCat, dá uma olhada lá pra ver o que tá acontecendo.
F
fbrigatt
Acho que o erro é esse: 08-15 01:21:03.032: E/AndroidRuntime(1343): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.oficinavittorazo/br.com.oficinavittorazo.CarrosCliente}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
O id ta pegando, mas ta dando erro quando vai abrir a tela da classe CarrosCliente.
W
wagnerfrancisco
Certo, veja que o problema é no cursor. Neste local:
Provavelmente cliente.getColumnIndex("_id") está retornando -1. Você tem certeza que este campo ("_id") está no select? Cola o select que é chamado quando você faz mDb.getCliente pra nós vermos.
No segundo parâmetro do método query você deveria estar passando um array com as colunas que quer trazer do banco. Eu vi lá no seu código inicial que vc tinha DbAdapter.KEY_NOME, DbAdapter.KEY_ENDERECO, etc. Neste parâmetro você deve passar um array com estes campos.
F
fbrigatt
Como faz isso? Não entendi… Eu só quero o id e o nome.
W
wagnerfrancisco
Hum, passando null ele vai retornar todos os campos do banco, então não precisa alterar conforme eu falei no último post.
Se isto não resolver, só sabendo quais são as colunas da sua tabela no banco de dados pra resolver.
F
fbrigatt
Deu erro ao clicar no item da lista:
08-15 01:41:39.021: E/AndroidRuntime(1426): java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.oficinavittorazo/br.com.oficinavittorazo.CarrosCliente}: android.database.CursorIndexOutOfBoundsException: Index -1 requested, with a size of 1
Para a tabela Carros faria o mesmo do código acima? E no caso do id do cliente, teria que ter na tabela Carros, ou seja os campos seriam esses:
IdCarro
IdCliente
Placa
Modelo
W
wagnerfrancisco
Cara, quanto ao campo ser não editável, eu não sei como tá isso nas versões atuais do Android, mas há um tempo atrás era uma droga, por que a propriedade editable não funcionava. Tem várias gambiarras pra fazer isso, eu usava essa:
O procedimento para outras tabelas é semelhante. Recomendo que ao invés de ter apenas uma classe chamada DbAdapter, você tenha várias: ClienteDbAdapter, CarroDbAdapter, etc. Aí cada uma tem as suas informações.
F
fbrigatt
Beleza, vou setar num TextView, ai não tem como editar. Seria igual o conteúdo somente mudando o nome da tabela? E onde cria o banco?
private static final String DATABASE_NAME = “oficina”;
private static final int DATABASE_VERSION = 1;