Dúvida Editar E Apagar!
#1
Mensagem publicada 22 June 2012 - 14:42
Eu estou a fazer uma "pequena" aplicação que permite guardar vários preços, quer seja do combustivel, diversos, alimentação, entre outros...
Eu estou a organizar as listagens por listviews, tudo na mesma actividade, e nao estou a conseguir nem apagar nem editar. Eu ja tinha feito um projecto semelhante mas com apenas tarefas e deu na boa. Agora tou a usar da mesma maneira e nao acontece nada.
O meu apagar esta assim:
btnApagarCombustivel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Combustivel Combustivel = new Combustivel();
Combustivel.setID(THE_ID);
CombustivelDataBaseHandler db_Apaga = new CombustivelDataBaseHandler(getApplicationContext());
db_Apaga.DeleteCombustivel(Combustivel);
btnApagarCombustivel.setVisibility(View.GONE);
btnEditarCombustivel.setVisibility(View.GONE);
txtEditarCombustivel.setVisibility(View.GONE);
Toast myToast = Toast.makeText(getApplicationContext(),
"Preço apagado com sucesso.", Toast.LENGTH_LONG);
myToast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL, 0, 100);
myToast.setDuration(3000);
myToast.show();
THE_ID = 0;
db_Combustivel = new CombustivelDataBaseHandler(getApplicationContext());
db_Combustivel.getAllCombustiveis();
}
});
E o editar assim:
btnEditarCombustivel.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
String txtEdicaoCombustivel = ((EditText) findViewById(R.id.et_EditarCombustivel)).getText().toString();
if(txtEdicaoCombustivel.length() != 0){
//double ConversaoEdicaoComb = Double.parseDouble(txtEdicaoCombustivel);
Combustivel oCombustivel = new Combustivel(txtEdicaoCombustivel);
CombustivelDataBaseHandler db_editaCombustivel = new CombustivelDataBaseHandler(getApplicationContext());
oCombustivel.setID(THE_ID);
Toast myToast = Toast.makeText(getApplicationContext(),
"Preço actualizado com sucesso.", Toast.LENGTH_LONG);
myToast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL, 0, 100);
myToast.setDuration(3000);
myToast.show();
db_editaCombustivel.UpdateCombustivel(oCombustivel);
btnEditarCombustivel.setVisibility(View.GONE);
btnApagarCombustivel.setVisibility(View.GONE);
txtEditarCombustivel.setVisibility(View.GONE);
THE_ID = 0;
db_editaCombustivel = new CombustivelDataBaseHandler(getApplicationContext());
db_editaCombustivel.getAllCombustiveis();
}
}
});
Alguem me pode dar uma sugestao de como posso resolver isto?? Quer dizer, a suposta parte mais dificil ja esta, que e apanhar o id seleccionado na listview e preencher esse objecto no meu edittext. Depois disso aparecem 2 botoes, precisamente o apagar e o editar, mas nenhum deles faz o que deve fazer. Mas aparecem os toasts sempre a dizer sucesso.
Obrigado a quem me possa ajudar!
Cumprimentos
#2
Mensagem publicada 22 June 2012 - 15:02
O que faz o getAllCombustiveis()? Porque tás sempre a criar novos DataBaseHandler, não chega 1?! Ainda por cima, sendo tudo na mesma Activity, chega perfeitamente 1
#3
Mensagem publicada 22 June 2012 - 15:05
Faz mal estar ali? Eu num outro trabalho, onde fazia em actividades diferentes, depois da sua ediçao, chamava um metodo finish do tipo:
@Override
public void finish() {
db = new TaskDataBaseHandler(this);
db.getAllTasks();
super.finish();
}
EDIT: Esqueci me de dizer que tenho os dados guardados numa arraylist declarada globalmente. Assim como DataBaseHandler respectiva do tipo:
ArrayList<Combustivel> theCombustivel;
CombustivelDataBaseHandler db_Combustivel;
Editado por nAndroid93, 22 June 2012 - 15:43.
#4
Mensagem publicada 22 June 2012 - 16:06
Método correcto de usar:
- 1 DataSource <-> 1 Handler
- 1 ListView <-> 1 Adapter
O Adapter liga-se ao Handler para ir buscar a informação, que é como tu deves ter para preencher a ListView. Depois se fizeres alterações no Handler, consequentemente fazes no DataSource, portanto já só tens que refrescar o Adapter que depois actualiza automáticamente a ListView.
Para refrescar o adapter é tão simples como: adapter.notifyDataSetChanged()
Assim tens 1 coisa de cada e não andas sempre a recriar tudo.
#5
Mensagem publicada 22 June 2012 - 16:28
theCombustivel.notify() ou notifyAll() e nao o notifyDataSetChanged. Eu na classe do adapter apenas tenho o meu adapter, claro e o getView.
#6
Mensagem publicada 23 June 2012 - 21:27
Obrigado
#7
Mensagem publicada 23 June 2012 - 21:46
O exemplos acima, embora funcionem, estão incorrectos.Por favor, se alguem me souber ajudar, agradecia imenso, eu nao consigo encontrar exemplos na net, e ate agora isto dava bem. É que eu nao tenho a certeza se quer o editar ou apagar funcionam direito. O listar é o menos importante. Os exemplos acima nao estao bem?
Obrigado
A maneira correcta de os fazer é como te disse, e no meu exemplo, "adapter" é um nome ficticio duma variável que se refere ao teu adapter. Não disse para tornares nada num Adapter puro e duro pois esse é um Interface e não te faz nada.
#8
Mensagem publicada 23 June 2012 - 23:27
Obrigado!
#9
Mensagem publicada 24 June 2012 - 22:55
Os exemplos acima são os que não funcionam correctamente, daí eu pedir ajuda! Eu ja tinha o adapter declarado globalmente. O que complica as coisas é ser tudo na mesma actividade. E tornar X coisas visiveis, X coisas invisiveis e encontrar forma de conseguir por tudo a trabalhar no mesmo sitio...
Obrigado!
Mas se sabes o ID da row, montando o esquema como te disse é só fazer:
int rowID = metodoParaIrBuscarALinha(); int index = converterORowIdParaIndex(rowID); // Apenas necessário se o rowID não for já o index db.apagar(index); listadapter.notifyDataSetChanged(); // Done
#10
Mensagem publicada 25 June 2012 - 08:27
Eu não tenho o metodo para ir buscar a Row, isto se tiver a falar do handler, creio que nao tenho nada disso.
#11
Mensagem publicada 25 June 2012 - 11:26
Mais uma vez, é um exemplo, desde que apagues/edites a linha correcta, fazes como quiseres O objectivo é ter apenas um source de informação e actualizar apenas esse source. O resto vai beber de lá...Porque e que e necessario converteroRowId para index se ambos são inteiros?
Eu não tenho o metodo para ir buscar a Row, isto se tiver a falar do handler, creio que nao tenho nada disso.
#12
Mensagem publicada 26 June 2012 - 09:03
Obrigado pela sua disponibilidade
Cumprimentos
#13
Mensagem publicada 26 July 2012 - 14:34
Um "especialista" andou me a ver o codigo, e disse me que o "ID" estava a 0. Existe algo la em cima que fiz mal! De resto ele diz que esta certo, mas recusa se de me dizer a soluçao lol... eu ate tive a ver o meu outro projecto, mas a diferença e que sao em actividades diferentes. Eu quero resolver isto so o mais depressa possivel.
Codigo do outro projecto:
if(getIntent().hasExtra("theID")){ theID = Integer.parseInt(getIntent().getExtras().getString("theID")); TaskDataBaseHandler db = new TaskDataBaseHandler(getApplicationContext()); Tasks theTasks = db.getTasks(theID); etName = (EditText) findViewById(R.id.etNome); etName.setText(theTasks.getTask()); DateTask.setText(theTasks.getDate()); HourTask.setText(theTasks.getHour()); } btnSave = (Button) findViewById(R.id.btnGravar); btnDelete = (Button) findViewById(R.id.btnApagar); if(theID == 0) { btnDelete.setVisibility(View.GONE); } btnSave.setonclickListener(new View.onclickListener() { @Override public void onclick(View v) { String TheTask = ((EditText) findViewById(R.id.etNome)).getText().toString(); String TheDate = ((TextView) findViewById(R.id.TvDataTarefa)).getText().toString(); String TheHour = ((TextView) findViewById(R.id.tvHoraActual)).getText().toString(); Tasks theTasks = new Tasks(TheTask, TheDate, TheHour); TaskDataBaseHandler db = new TaskDataBaseHandler(getApplicationContext()); //Para mudar a cor das textviews... //TextView.setTextColor(Color.BLUE); if(TheTask.equalsIgnoreCase("")){ AlertDialog("Erro", "Tarefa não preenchida."); }else{ if(theID == 0){ db.addTask(theTasks); Toast myToast = Toast.makeText(getApplicationContext(), "Tarefa adicionada com sucesso.", Toast.LENGTH_LONG); myToast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL, 0, 100); myToast.setDuration(3000); myToast.show(); }else{ theTasks.setID(theID); Toast myToast = Toast.makeText(getApplicationContext(), "Tarefa actualizada com sucesso.", Toast.LENGTH_LONG); myToast.setGravity(Gravity.CENTER_HORIZONTAL|Gravity.CENTER_VERTICAL, 0, 100); myToast.setDuration(3000); myToast.show(); db.UpdateContact(theTasks); } Intent i = new Intent(EditTasks.this, ViewTasks.class); startActivity(i); finish(); }O exemplo acima funciona na perfeiçao e ve-se que eu estou a usar precisamente o mesmo objecto para editar ou apagar... sera que alguem me consegue ver o disparate que estou a fazer? (Foi isto o que ele disse )
Recapitulando, o primeiro post que fiz tem o evento dos 2 botoes com que eu tou a trabalhar.
Ja agora aproveito para meter como e que faço com que aparecam os objectos assim que clico num item da listview (isto funciona!!!)
lstCombustivel.setOnItemClickListener(new OnItemClickListener() { @Override public void onItemClick(AdapterView<?> parent, View view, int position, long id) { int CombustivelSeleccionado = theCombustivel.get(position).getID(); Combustivel Ocombustivel = db_Combustivel.getCombustiveis(CombustivelSeleccionado); tv_EditarDataCombustivel.setVisibility(View.VISIBLE); btnEditarCombustivel.setVisibility(View.VISIBLE); btnApagarCombustivel.setVisibility(View.VISIBLE); txtEditarCombustivel.setVisibility(View.VISIBLE); btnAlterarDataCombustivel.setVisibility(View.VISIBLE); txtEditarCombustivel.setText(Ocombustivel.getPreco()); tv_EditarDataCombustivel.setText("Data (Ano/Mês/Dia): " + Ocombustivel.getData()); } } ); lstCombustivel.setAdapter(new CombustivelAdapter(getApplicationContext() , android.R.layout.simple_list_item_1, theCombustivel));É vital que eu termine isto, e apreciaria muito ajuda!
Cumprimentos!
#14
Mensagem publicada 26 July 2012 - 14:44
#15
Mensagem publicada 26 July 2012 - 14:58
#16
Mensagem publicada 26 July 2012 - 15:27
#17
Mensagem publicada 26 July 2012 - 15:38
Obrigado desde ja pelas suas respostas
#18
Mensagem publicada 26 July 2012 - 15:40
#19
Mensagem publicada 26 July 2012 - 15:49
int CombustivelSeleccionado = theCombustivel.get(position).getID();
The_ID = CombustivelSeleccionado
e depois posso usa lo num outro sitio?
Se visse o codigo era mais simples ;P
#20
Mensagem publicada 26 July 2012 - 15:54
#21
Mensagem publicada 26 July 2012 - 16:19
Inacreditável como era só isto!
Agora juro, ultima pergunta!
Tenho dois atributos. Que e o preço e a data. Eu la faço essa treta toda no sqlite, ate tenho o codigo la em cima. Mas no adapter e onde eu chamo os meus texviews e chamo desta maneira:
@Override public View getView(int position, View convertView, ViewGroup parent) { View v = convertView; if (v == null){ LayoutInflater vi = (LayoutInflater) getContext() .getSystemService(Context.LAYOUT_INFLATER_SERVICE); v = vi.inflate(R.layout.list_item_combustivel, null); } Combustivel Combustivel = combustivel.get(position); if (Combustivel != null){ TextView TvPreco = (TextView) v.findViewById(R.id.TvPrecoDoCombustivel); TextView TvData = (TextView) v.findViewById(R.id.TvDataDoCombustivel); if (Combustivel != null) { TvPreco.setText("Preço do Combustível: " + Combustivel.getPreco() + " €"); TvData.setText("Data (Ano/Mês/Dia): " + Combustivel.getData()); } } return v; }
Isto e, como se sabe, o que preenche cada item da listview...
Agora eu so quero e obter a soma de todos os preços no cabeçalho da listview. Eu criei uma textview em cima dela, po lado direito e faço assim no codigo mesmo da listagem:
Combustivel combustivelTotal = new Combustivel(); String precoTotal = ""; precoTotal += combustivelTotal.getPreco(); tv_TotalCombustivel.setText("Total: " + precoTotal);
Eu creio que e errado fazer o new Combustivel, mas la esta, sendo novo nisto faço erros basicos lol
Mesmo se nao me responda ou nao saiba dizer ao certo, juro que ja me salvou a vida!
Cumprimentos!
#22
Mensagem publicada 27 July 2012 - 08:47
Primeiro, Strings não se somam, portanto o que estás a fazer é concatenar strings
Depois, o que estás a fazer não é o que queres
Tens que criar uma variável global na class que tem esse getView() (que mostras neste último post) do género:
private float somatorio;Depois no getView(), é só ires fazendo:
somatorio += Combustivel.getPreco();de cada vez que lês um registo.
Depois é só criares um método na classe respectiva que te leia aquele valor. Algo do género:
public float getSomatorio() { return somatorio; }E usares esse método para preencheres a tal TextView que falaste para o somatório.
#23
Mensagem publicada 27 July 2012 - 09:27
Obrigado!
EDIT: Ignora a pergunta anterior lol! Ja descobri a maneira (que noob lol )
Entao o codigo que ponho na getView() pode ser logo no inicio? Ou tem de ser depois de alguns if's?
Editado por nAndroid93, 27 July 2012 - 09:53.
#24
Mensagem publicada 27 July 2012 - 10:02
Também podes fazer melhor ainda:
No Database Handler que criaste, cria um método que te faço um sum() de todos os valores que tens em DB. pronto fica logo feito
#25
Mensagem publicada 27 July 2012 - 10:07
Facilitou me tanto a vida que ia aí para a ilha da Terceira cumprimentá-lo hahaha.
Muito obrigado
Editado por nAndroid93, 27 July 2012 - 10:19.