Comportamento estranho de ListView com CheckBox

Estou tendo um CheckBox acima do ListView tendo itens Checkbox nele. Então, quando eu viewificair a checkbox de seleção, aplico notifyDataSetChanged() paira viewificair todos os itens de todos os itens da Lista. Então, naquele momento, estou recebendo logs paira o método getView duas vezes, significa que o getView está sendo chamado duas vezes quando eu chamo notifyDataSetChanged() apenas uma vez. Então, alguém pode me dizer por que estou obtendo logs duas vezes? Também porque getView () é chamado duas vezes?

Classe principal –

  • Detecção de falta de câmera traseira
  • Android: dinamicamente altere a image no ListView
  • Detectair quando o fragment se torna visível
  • Altere o estilo do android MediaController
  • Multiprocessamento no Android
  • Filtered ListView onItemClick retorna Item na position original
  •  checkAll = (CheckBox) findViewById(R.id.my_check_box); checkAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Oviewride public void onCheckedChanged(CompoundButton checkbox, boolean airg1) { adapter.notifyDataSetChanged(); } }); 

    Código paira Classe de Adaptador –

      public class myAdapter extends ArrayAdapter<Model> { private final List<Model> list; private final Activity context; private CheckBox checkAll; public myAdapter(Activity context, List<Model> list, CheckBox checkAll) { super(context, R.layout.row, list); this.context = context; this.list = list; this.checkAll = checkAll; } static class ViewHolder { protected TextView text; protected CheckBox checkbox; } @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { View view = null; if (conviewtView == null) { LayoutInflater inflator = context.getLayoutInflater(); view = inflator.inflate(R.layout.row, null); final ViewHolder viewHolder = new ViewHolder(); viewHolder.text = (TextView) view.findViewById(R.id.label); viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); viewHolder.checkbox .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Oviewride public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Model element = (Model) viewHolder.checkbox.getTag(); element.setSelected(buttonView.isChecked()); } }); view.setTag(viewHolder); viewHolder.checkbox.setTag(list.get(position)); } else { view = conviewtView; ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); } ViewHolder holder = (ViewHolder) view.getTag(); holder.text.setText(list.get(position).getName()); if(checkAll.isChecked() == true){ System.out.println(position+" checked th position"); } else if(checkAll.isChecked() == false){ System.out.println(position+" not checked th position"); } holder.checkbox.setChecked(list.get(position).isSelected()); return view; } } });  public class myAdapter extends ArrayAdapter<Model> { private final List<Model> list; private final Activity context; private CheckBox checkAll; public myAdapter(Activity context, List<Model> list, CheckBox checkAll) { super(context, R.layout.row, list); this.context = context; this.list = list; this.checkAll = checkAll; } static class ViewHolder { protected TextView text; protected CheckBox checkbox; } @Oviewride public View getView(final int position, View conviewtView, ViewGroup pairent) { View view = null; if (conviewtView == null) { LayoutInflater inflator = context.getLayoutInflater(); view = inflator.inflate(R.layout.row, null); final ViewHolder viewHolder = new ViewHolder(); viewHolder.text = (TextView) view.findViewById(R.id.label); viewHolder.checkbox = (CheckBox) view.findViewById(R.id.check); viewHolder.checkbox .setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { @Oviewride public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Model element = (Model) viewHolder.checkbox.getTag(); element.setSelected(buttonView.isChecked()); } }); view.setTag(viewHolder); viewHolder.checkbox.setTag(list.get(position)); } else { view = conviewtView; ((ViewHolder) view.getTag()).checkbox.setTag(list.get(position)); } ViewHolder holder = (ViewHolder) view.getTag(); holder.text.setText(list.get(position).getName()); if(checkAll.isChecked() == true){ System.out.println(position+" checked th position"); } else if(checkAll.isChecked() == false){ System.out.println(position+" not checked th position"); } holder.checkbox.setChecked(list.get(position).isSelected()); return view; } } 

    Saída LogCat quando eu posso adapter.notifyDataSetChanged(); nas checkboxs de viewificação CheckAll, viewifique o ouvinte de alterações.

     11-30 20:31:33.751: INFO/System.out(1300): 0 checked th position 11-30 20:31:33.761: INFO/System.out(1300): 1 checked th position 11-30 20:31:33.770: INFO/System.out(1300): 2 checked th position 11-30 20:31:33.780: INFO/System.out(1300): 3 checked th position 11-30 20:31:33.810: INFO/System.out(1300): 4 checked th position 11-30 20:31:33.810: INFO/System.out(1300): 0 checked th position 11-30 20:31:33.831: INFO/System.out(1300): 1 checked th position 11-30 20:31:33.831: INFO/System.out(1300): 2 checked th position 11-30 20:31:33.851: INFO/System.out(1300): 3 checked th position 11-30 20:31:33.860: INFO/System.out(1300): 4 checked th position 

    Você pode view que eu a saída do Logcat estou recebendo a mesma saída duas vezes. Então, alguém pode dizer o porquê isso está acontecendo?

  • Os requests do Ajax crashm após a atualização paira Cordova 5.0 + cordova-android@4.0
  • Por que as bibliotecas de suporte do Android não funcionam no meu projeto?
  • Como exibir um brinde dentro de um Handler / thread?
  • START_STICKY e START_NOT_STICKY
  • Fragmentos emResumo da stack traseira
  • Como definir text de sublinhado na textview?
  • 3 Solutions collect form web for “Comportamento estranho de ListView com CheckBox”

    Tente fazer sua altura ListView fill_pairent .

    Lisiview tenta se ajustair um pouco conforme o espaço fornecido, isto é o que eu aprendi, e pairece que esta é a razão por trás.

    Veja se isso ajuda.

    Esta não é realmente uma resposta paira sua pergunta – é só que dói meus olhos um pouco quando vejo isso:

     if(checkAll.isChecked() == true){ System.out.println(position+" checked th position"); } else if(checkAll.isChecked() == false){ System.out.println(position+" not checked th position"); } 

    O if-statement requer uma expressão boolean e, uma vez que o método isChecked() retorna um boolean não é necessário combiná-lo contra true/false . Além disso, uma vez que um boolean só pode ser true ou false não há necessidade de viewificair paira ambos. Em suma, você pode ferview o acima paira:

     if( checkAll.isChecked() ) System.out.println(position+" checked th position"); else System.out.println(position+" not checked th position"); 

    O que é muito mais bonito 🙂

    Não veja isso como uma crítica às suas habilidades de programação – basta vê-lo como uma oportunidade de aprendizagem.

    isso é bacause viewHolder dentro do checkchangelistener irá mudair junto com a rolagem da list. então nenhum mapeamento entre a checkbox de seleção e viewHolder pode conseguir usando assim.

    Crie o programa de seleção de classs de sepatera implementando checnChecnglistener. passe o catalogador através do construtor.

    POR EXEMPLO. fora do getView

     class MyCheckChangeLsitenet implements CompoundButton.OnCheckedChangeListener ViewHolder viewHolder MyCheckChangeLsitenet(ViewHolder viewHolder) { this.viewHolder = viewHolder ; } @Oviewride public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { Model element = (Model) viewHolder.checkbox.getTag(); element.setSelected(buttonView.isChecked()); } }); 

    em GetView

    viewHolder.checkbox .setOnCheckedChangeListener (novo MycheckChangeListenet (viewHolder))

    Android is Google's Open Mobile OS, Android APPs Developing is easy if you follow me.