Pergunta

Eu tenho um listview contendo checkbox e textview e adicionei um ViewBinder ao meu adaptador e neste viewbinder adicionei um ouvinte de estado onchecked às minhas caixas de seleção e no ouvinte de estado onchecked escrevi este código:

OnCheckedChangeListener myCheckChangList = new OnCheckedChangeListener() {
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                String id=buttonView.getTag()+"";
                int buttonid=Integer.valueOf(id);               
                if(buttonView.isChecked()==true){   
                    Log.d("checked","checked");
                myDbHelper.MarkAsFavorite(buttonid);

                }

                else if(buttonView.isChecked()==false){
                    Log.d("unchecked","unchecked");
                    myDbHelper.UnMarkAsFavorite(buttonid);
                }

                 cu=myDbHelper.GetCursor();
                 adapter.swapCursor(cu);

            }
        }; 

mas com esse código quando minha caixa de seleção estava sendo marcada, ele foi salvo no banco de dados, então quando eu rolar pela visualização de lista ele fica desmarcado sozinho, ele acessa o código do desmarcado e desmarca a caixa de seleção e salva no banco de dados.

Então eu consertei adicionando um ouvinte onclick à caixa de seleção em vez do ouvinte de estado onchange:

public void onclick(View view) {
         String id=view.getTag()+"";
            int buttonid=Integer.valueOf(id);               
            if(((CompoundButton) view).isChecked()==true){  
                Log.d("checked","checked");
            myDbHelper.MarkAsFavorite(buttonid);

            }

            else if(((CompoundButton) view).isChecked()==false){
                Log.d("unchecked","unchecked");
                myDbHelper.UnMarkAsFavorite(buttonid);
            }

             cu=myDbHelper.GetCursor();
             adapter.swapCursor(cu);
     }

E não tenho mais problemas.Mas eu queria saber por que esse ouvinte de mudança de estado agiu dessa maneira?

Foi útil?

Solução

Você tem isto checkbox dentro ListView como ListView reutiliza as visualizações para eficiência, o mesmo objeto de caixa de seleção pode ser fornecido para vários itens de ListView e quando é marcado, a mesma caixa de seleção é desmarcada para outro.

Outras dicas

Este ouvinte de estado de mudança agiu dessa maneira somente quando você rola um listview porque sua chamada getview novamente, o que altera o estado da caixa de seleção marcada, portanto, a chamada checkchangedlistner que altera o valor no banco de dados.E quando você usou onclick seu problema foi resolvido porque em você altera o evento onclick da visualização de lista, o evento onclick não é acionado, o que não está alterando o valor do seu banco de dados.

Você pode resolver esse problema usando o viewholder no listview.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top