Saltar para conteúdo


Foto
- - - - -

Dúvida Editar E Apagar!


  • Por favor inicie sessão para responder
25 respostas a este tópico

#1 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 22 June 2012 - 14:42

Boas pessoal!
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 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 22 June 2012 - 15:02

É normal que apareça o Toast, não o estás a condicionar de forma nenhuma :)
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 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 22 June 2012 - 15:05

O getAllCombustiveis() faz precisamente uma "actualizaçao" da listview. Ou seja quando o utilizador carrega seja no editar ou apagar, a listview abaixo e automaticamente actualizada.
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 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 22 June 2012 - 16:06

Então tás sempre a criar Handlers e mais Handlers e a deixares memória perdida com aqueles que deixas de usar.
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 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 22 June 2012 - 16:28

Ao fazer o adapter, neste caso o theCombustivel aparece:
theCombustivel.notify() ou notifyAll() e nao o notifyDataSetChanged. Eu na classe do adapter apenas tenho o meu adapter, claro e o getView.

#6 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 23 June 2012 - 21:27

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

#7 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 23 June 2012 - 21:46

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

O exemplos acima, embora funcionem, estão incorrectos.
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 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 23 June 2012 - 23:27

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!

#9 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

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 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 25 June 2012 - 08:27

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.

#11 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 25 June 2012 - 11:26

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.

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á...

#12 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 26 June 2012 - 09:03

Ok, eu vou fazer isso ;)
Obrigado pela sua disponibilidade :D

Cumprimentos

#13 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 26 July 2012 - 14:34

Bem passado um tempo (estive ocupado com outra coisa) voltei para isto. Andei a ver e a ver, mas isto nao e mesmo o que quero.
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 :P)
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 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 26 July 2012 - 14:44

mas de onde é que vem o "THE_ID"??

#15 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 26 July 2012 - 14:58

O THE_ID supostamente e a variavel que vai transportar o ID seleccionado na listview (para depois apagar ou editar) ... mas isso e do trabalho anterior e decidi incorporar neste, daí a minha incerteza se a devo utilizar ou nao... e so mesmo a diferença a THE_ID ser utilizada (e bem, funciona na perfeiçao) em duas actividades diferentes mas agora na mesma actividade fico com essa duvida.

#16 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 26 July 2012 - 15:27

A diferença é que com duas actividades passas esse valor de uma para a outra, e com uma, não estás a fazer nada com ela porque nunca lhe estas a atribuir um valor :P

#17 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 26 July 2012 - 15:38

Entao falando em portugues o que e que posso alterar/apagar no codigo acima? (logo o do primeiro post, tendo em conta que e na mesma actividade)
Obrigado desde ja pelas suas respostas ;)

#18 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 26 July 2012 - 15:40

Tens que ir buscar o ID e substituir o THE_ID por esse valor que vais buscar. Para ires buscar é só veres como fazias dantes. (tou a falar decor, nem sequer estou a olhar para o código :P)

#19 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 26 July 2012 - 15:49

Mas entao sera que posso igualar, no clique do listviewItem isto?

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 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 26 July 2012 - 15:54

O código é esse. Tem é que ser feito sempre que clicas ;)

#21 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 26 July 2012 - 16:19

Amigo, o meu muito obrigado, isto funciona na perfeição!!
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 :P


Mesmo se nao me responda ou nao saiba dizer ao certo, juro que ja me salvou a vida! :D:D

Cumprimentos!

#22 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 27 July 2012 - 08:47

Não. Tá errado em vários aspectos :)
Primeiro, Strings não se somam, portanto o que estás a fazer é concatenar strings :P
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 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 27 July 2012 - 09:27

Pois, é que eu tinha o meu atributo preço como string, pois nao me causava qualquer transtorno, mas pronto tou a mudar tudo para float, faço os parseFloats e isso... mas... como e que faço um SetText na TextView sendo o Combustivel.getPreco como Float?
Obrigado!
EDIT: Ignora a pergunta anterior lol! Ja descobri a maneira (que noob lol :P)
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 r3pek

r3pek

    Guru de Android

  • Former Staff
  • PipPipPipPipPip
  • 1560 mensagens
  • LocalizaçãoBA4 - Terceira - Açores
  • Nexus One + Motorola XOOM

Mensagem publicada 27 July 2012 - 10:02

Tem que ser no mesmo sitio que atribuis o valor à textview do valor. Senão quando fazias scroll tavas sempre a somar ao total :P
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 :P

#25 nAndroid93

nAndroid93

    Membro

  • Membros
  • PipPip
  • 21 mensagens

Mensagem publicada 27 July 2012 - 10:07

Meu amigo, o meu muito obrigado pela sua ultima sugestão, é de facto MUITO mais fácil. Já funciona na perfeição e sinto um alívio tremendo
Facilitou me tanto a vida que ia aí para a ilha da Terceira cumprimentá-lo hahaha.
Muito obrigado :D:D

Editado por nAndroid93, 27 July 2012 - 10:19.