6

Tengo un CheckBox encima del ListView que tiene elementos de casilla de verificación en él. Entonces, cuando marque la casilla de verificación, aplicaré notifyDataSetChanged() para verificar todos los elementos de la lista. Entonces en ese momento estoy obteniendo registros para el método getView dos veces, significa que se llama a getView dos veces cuando llamo al notifyDataSetChanged() solo una vez. Entonces, ¿alguien puede decirme por qué estoy recibiendo registros dos veces? ¿Por qué también getView() se llama dos veces?Weird Behavior of ListView with CheckBox

Clase Principal -

Código
checkAll = (CheckBox) findViewById(R.id.my_check_box); 
     checkAll.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { 

      @Override 
      public void onCheckedChanged(CompoundButton checkbox, boolean arg1) { 
       adapter.notifyDataSetChanged(); 
      } 
     }); 

para la clase 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; 
    } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
     View view = null; 
     if (convertView == 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() { 

         @Override 
         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 = convertView; 
      ((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; 
    } 
} 

LogCat salida Cuando puedo adapter.notifyDataSetChanged(); en checkboxs checkAll inspeccionar el cambio de escucha.

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 

Puede ver que la salida de Logcat obtengo el mismo resultado dos veces. Entonces, ¿alguien puede decir por qué está sucediendo esto?

+1

este problema también plantea conmigo ... +1 –

+2

http: // stackoverflow.com/questions/2618272/custom-listview-adapter-getview-method-being-called-multiple-times-and-in-no-co compruebe esto – MKJParekh

+0

@Lalit Poptani ¿Se desplaza? – Venky

Respuesta

5

Trate de hacer su ListView altura fill_parent.

Lisiview intenta ajustar un poco según el espacio proporcionado, esto es lo que aprendí, y parece que esta es la razón detrás.

Ver si ayuda.

+2

que significa que cuando quiere establecer su vista de lista en la mitad de la pantalla ... ¿no puede resolver el problema anterior? – MKJParekh

+0

puede estar en la mitad de la pantalla en la parte inferior con fill_parent .............. – viv

+0

si desea establecer su vista de lista en la mitad de la pantalla, puede usar android: layout_weight para ese –

0

esto es debido a que la vista del interior de checkchangelistener cambiará junto con el desplazamiento de la lista. por lo tanto, no hay ningún mapeo entre la casilla de verificación y la vista se puede usar de esta manera.

crear sepatera class checkchangelistener implementa checnChecnglistener. pasar checkchangelistener a través del constructor.

EG. fuera getView

class MyCheckChangeLsitenet implements CompoundButton.OnCheckedChangeListener 

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

en GetView

viewHolder.checkbox .setOnCheckedChangeListener (nueva MycheckChangeListenet (viewHolder))

+1

No estoy haciendo una lista de desplazamiento actualmente, aunque da el mismo problema. –

+0

olvida el término scroll. tratando de familiarizarte con el procesamiento interno de ListView. pasar por la forma descrita. resolverá su problema –

3

Esto no es realmente una respuesta a su pregunta - es sólo que me duelen los ojos un poco cuando veo esto:

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

El if-statement requiere una expresión boolean y desde el método isChecked() devuelve un boolean theres no es necesario que coincida con true/false. Además, como un boolean solo puede ser true o false, no es necesario verificar ambos. En resumen se puede hervir lo anterior reduce a:

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

que es mucho más bonito :-)

no ven esto como crítica de sus habilidades de programación - sólo verlo como un ágape aprendizaje.

+0

Bien es solo una aplicación de demostración para obtener la idea exacta de mi problema. Gracias también. –

+0

¡Eso es hilarante, kaspermoerch! Pruebe esto: 'System.out.println (position + (checkAll.isChecked()?" Checked th position ":" check this position ");' –

+0

Eso también funciona, Jeff. Sin embargo, sí encuentro que el operador ternario debe usarse con precaución. No siempre mejora la legibilidad. – kaspermoerch

Cuestiones relacionadas