Tecnologia do Blogger.
RSS

Re: [androidbrasil-dev] ListView repetindo registros

Neto, vou dar uma estudada nessa questão de Adapter como você aconselhou...
Qualquer duvida que eu tiver eu posto aqui.

Valeu

Em 15 de abril de 2012 22:59, Neto Marin <netomarin@gmail.com> escreveu:
Como eu disse, vc precisa dar uma estudada em como funciona o Adapter.

Resumindo, é o seguinte, o método getView é executado para cada célula que vai ser renderizada. Mas para não sobrecarregar a memória, o Android cria só o número de views que cabem na tela. E então ele chama o método getView e passa a convertView que será utilizada para exibir os dados na tela.

E essa convertView só é nula UMA vez, que é quando ela é criada pela primeira vez. Daí em diante, você poderia simplesmente atualizar o conteúdo dela, dai o padrão de uso do ViewHolder e sim, vale a pena usar o ViewHolder, de uma procurada sobre isso.

Na sua lógica então, sempre que ele executa novamente o getView, como a convertView não é mais nula, vc simplesmente retorna ela como ela estava, ou seja, como ela foi gerada na primeira vez.

Então no if (convertView == null) { ... vc deve inflar o layout e atribui-lo para para a convertView, e SEMPRE, vc vai atualizar os componentes do seu layout com a informação que você quer.

Sobre a questão q vc pediu ajuda, é só vc ajustar a lógica. Armazene o estado original do checkbox e caso o cara clique no negativeButton vc volta ele pro estado anterior.

[]s
Neto
---
Neto Marin

Blog: http://blog.netomarin.com
GTalk: netomarin@gmail.com
MSN: neto_marin@hotmail.com
Skype: netomarin


On Sun, Apr 15, 2012 at 9:50 PM, Luiz Gustavo Mafra <lgmafra@gmail.com> wrote:
Leonardo, eu tentei fazer isso, mas acaba dando erro...

04-16 00:49:10.602: E/AndroidRuntime(19294): Uncaught handler: thread main exiting due to uncaught exception
04-16 00:49:10.633: E/AndroidRuntime(19294): java.lang.NullPointerException
04-16 00:49:10.633: E/AndroidRuntime(19294): at com.simpatico.sgf.ViewMovimentos$8.onClick(ViewMovimentos.java:448)
04-16 00:49:10.633: E/AndroidRuntime(19294): at com.android.internal.app.AlertController$ButtonHandler.handleMessage(AlertController.java:158)
04-16 00:49:10.633: E/AndroidRuntime(19294): at android.os.Handler.dispatchMessage(Handler.java:99)
04-16 00:49:10.633: E/AndroidRuntime(19294): at android.os.Looper.loop(Looper.java:123)
04-16 00:49:10.633: E/AndroidRuntime(19294): at android.app.ActivityThread.main(ActivityThread.java:4363)
04-16 00:49:10.633: E/AndroidRuntime(19294): at java.lang.reflect.Method.invokeNative(Native Method)
04-16 00:49:10.633: E/AndroidRuntime(19294): at java.lang.reflect.Method.invoke(Method.java:521)
04-16 00:49:10.633: E/AndroidRuntime(19294): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:860)
04-16 00:49:10.633: E/AndroidRuntime(19294): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:618)
04-16 00:49:10.633: E/AndroidRuntime(19294): at dalvik.system.NativeStart.main(Native Method)


Em 15 de abril de 2012 21:45, Leonardo Jobim <leo.jobim@gmail.com> escreveu:

Não entendi muito bem o problema.
Mas vc não tem como gravar em uma variável o estado original do checkbox e atribuí-lo no onClick() do negative Button ?

Em 15 de abril de 2012 21:38, Luiz Gustavo Mafra <lgmafra@gmail.com> escreveu:

Deixa eu pedir também uma ajudinha em uma parte do getView em particular.
Na getView eu tenho essa parte de código

chkQuitado.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
ViewMovimentos vm = new ViewMovimentos();
if(isChecked){
   vm.marcaMovQuitado(Integer.parseInt(entry.getMovId()), "Deseja marcar este movimento como pago?", context, QUITAR_MOV);
}else{
   vm.marcaMovQuitado(Integer.parseInt(entry.getMovId()), "Deseja marcar este movimento como á pagar?", context, DES_QUITAR_MOV);
      }
   }
});

Nessa parte eu chamo o método

public void marcaMovQuitado(final int movId, String msg, final Context context, final int marcaMov){
AlertDialog.Builder builder = new AlertDialog.Builder(context);
builder.setMessage(msg);
builder.setPositiveButton("Sim", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
atualizaMov(context, movId, marcaMov);
}
});
builder.setNegativeButton("Não", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
dialog.dismiss();
}
});

AlertDialog dialog = builder.create();
dialog.setTitle("Aviso");
dialog.show();
}

Nesse marcaMovQuitado vai ser criado um alertDialog com dois botões, setPositiveButton e setNegativeButton, a ação do positiveButton está funcionando tranquilo, só que no negativeButton eu quero que ao clicar o estado do checkBox seja o estado original, ou seja, se ele estava desmarcado e ao clicar ele vai ser marcado e vai abrir o alertDialog, se eu clicar no negativeButton, eu quero que ele volte ao estado desmarcado e vice versa.

Já tentei de algumas formas fazer isso mas não consegui.

Vocês teriam alguma sugestão??

Att,

Em 15 de abril de 2012 21:20, Luiz Gustavo Mafra <lgmafra@gmail.com> escreveu:

Neto, no caso se eu não fizer esse teste para ver se a view está errado??

Em 15 de abril de 2012 21:18, Neto Marin <netomarin@gmail.com> escreveu:

Como eu tinha dito

Vc só cria a view qnd ela não é nula e depois não atualiza ela nunca mais.
De uma olhada em exemplos de Adapters. Vc precisa atualizar o conteúdo pois o Android reutiliza as views para exibir o conteúdo e assim não gastar memória desnecessariamente.

[]s
Neto
---
Neto Marin

Blog: http://blog.netomarin.com
GTalk: netomarin@gmail.com
MSN: neto_marin@hotmail.com
Skype: netomarin


On Sun, Apr 15, 2012 at 9:15 PM, Luiz Gustavo Mafra <lgmafra@gmail.com> wrote:
Olá, segue o meu getView()...

public View getView(int position, View convertView, ViewGroup viewGroup) {
final Movimentos entry = listMovimentos.get(position);
        if (convertView == null) {
            LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = inflater.inflate(R.layout.movimentos, null);
        
            
       TextView lancId = (TextView)convertView.findViewById(R.id.lancId);
       lancId.setText(entry.getLancId());
           
       TextView movId = (TextView)convertView.findViewById(R.id.movId);
       movId.setText(entry.getMovId());
       
       ImageView imgLancTipMov = (ImageView) convertView.findViewById(R.id.imgTipMov);
       imgLancTipMov.setImageResource(entry.getLancTipMov());
       TextView lancDescricao = (TextView) convertView.findViewById(R.id.lblLancDescricao);
       lancDescricao.setText(entry.getLancDescricao());
       TextView movDtaVencimento = (TextView) convertView.findViewById(R.id.lblMovDtaVencimento);
       movDtaVencimento.setText(entry.getMovDtaVencimento());
        
       TextView movValor = (TextView) convertView.findViewById(R.id.lblMovValor);
       movValor.setText(entry.getMovValor());
       movValor.setTextColor(entry.getCorMovValor());
        
        TextView movQtdParcela = (TextView) convertView.findViewById(R.id.lblMovQtdParcela);
        movQtdParcela.setText(entry.getMovParcela());
       
        CheckBox chkQuitado = (CheckBox)convertView.findViewById(R.id.chkQuitaMov);
        if(entry.getMovQuitado() == 1){
        chkQuitado.setChecked(false);
        }else if(entry.getMovQuitado() == 2){
        chkQuitado.setChecked(true);
        }        
        chkQuitado.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
ViewMovimentos vm = new ViewMovimentos();
if(isChecked){
vm.marcaMovQuitado(Integer.parseInt(entry.getMovId()), "Deseja marcar este movimento como pago?", context, QUITAR_MOV);
}else{
vm.marcaMovQuitado(Integer.parseInt(entry.getMovId()), "Deseja marcar este movimento como á pagar?", context, DES_QUITAR_MOV);
}
}
});
        
       
        }
        
        return convertView;
}

Em 15 de abril de 2012 21:08, Leonardo Jobim <leo.jobim@gmail.com> escreveu:

Vc usa o padrão ViewHolder? Este ajuda a evitar este tipo de coisa.

Além disso vc está usando o position de getView() para obter o registro certo?

Se postar o código, ajuda. Senão vai ser adivinhação msm ....

Em 15/04/2012 21:04, "Luiz Gustavo Mafra" <lgmafra@gmail.com> escreveu:

Boa noite a todos.

Estou utilizando uma ListView em minha app que até o momento eu achava estar funcionando normalmente.
Porém percebi a pouco que a cada 5 registros exibidos, a ListView começa a repetir os registros. Por exemplo:

Se eu tiver (a,b,c,d,e,f,g,h,i,j) a ListView vai mostrar na seguinte ordem (a,b,c,d,e,a,b,c,d,e).
Se tiver (a,b,c,d,e,f,g,h,i,j,k) a ListView vai mostrar na seguinte ordem (a,b,c,d,e,a,b,c,d,e,a).

Já verifiquei a minha consulta rodando ela no Sqlite Expert e funciona tranquilamente, fiz o debug indo registro a registro e vai tudo ok, mas na hora de exibir é q esta o problema.

Alguém poderia me ajudar??

Att,

--
Luiz Gustavo S. Mafra
Bacheralando em Ciência da Computação - UESC
Programador PHP, dotNet, Android

twitter: @lgmafra
skype: lgmafra




--
Luiz Gustavo S. Mafra
Bacheralando em Ciência da Computação - UESC
Programador PHP, dotNet, Android

twitter: @lgmafra
skype: lgmafra





--
Luiz Gustavo S. Mafra
Bacheralando em Ciência da Computação - UESC
Programador PHP, dotNet, Android

twitter: @lgmafra
skype: lgmafra




--
Luiz Gustavo S. Mafra
Bacheralando em Ciência da Computação - UESC
Programador PHP, dotNet, Android

twitter: @lgmafra
skype: lgmafra





--
Luiz Gustavo S. Mafra
Bacheralando em Ciência da Computação - UESC
Programador PHP, dotNet, Android

twitter: @lgmafra
skype: lgmafra





--
Luiz Gustavo S. Mafra
Bacheralando em Ciência da Computação - UESC
Programador PHP, dotNet, Android

+55 73 8142 3045

twitter: @lgmafra
skype: lgmafra

  • Digg
  • Del.icio.us
  • StumbleUpon
  • Reddit
  • RSS

0 comentários:

Postar um comentário