2017-03-22 1 views
1

Ich versuche, mehrere Kontrollkästchen zu bearbeiten, um Elemente aus einer Liste zu löschen oder zu bearbeiten, die Liste hat benutzerdefinierte Adapter mit benutzerdefinierten Layout, in diesem Layout erstellen ich das Kontrollkästchen, Allerdings erhalte ich eine IndexOutOfBounds-Ausnahme, wenn ich versuche, ein boolesches Array auszuwerten, auch wenn es initialisiert wurde.mehrere Kontrollkästchen, indexOutOfBounds in einem benutzerdefinierten Adapter mit Listenansicht

public MeasureTableAdapter(Activity context, ArrayList<MeasureEvi> myMeasureEvi) 
{ 
    super(context, R.layout.adapter_tablamedida_item, myMeasureEvi); 
    this.context = context; 
    this.myMeasureEvi = myMeasureEvi; 
    checked= new boolean[myMeasureEvi.size()]; //this is where I initialize the array 
} 

und das, wo ich die Ausnahme bei immer bin:

im Adapter

public View getView 

diese

if (checked[position]) { 
     holder.checkBox.setChecked(true); 
    } else { 
     holder.checkBox.setChecked(false); 
    } 

das Protokoll im Debug-Fenster

checked[position]= java.lang.IndexOutOfBoundsException : Invalid array range: 0 to 0 

das Protokoll in Android-Monitor

03-22 17:18:03.121 2024-3372/com.google.android.gms.persistent W/GLSUser: [AppCertManager] IOException while requesting key: 
                     java.io.IOException: Invalid device key response. 
                      at evk.a(:com.google.android.gms:274) 
                      at evk.a(:com.google.android.gms:4238) 
                      at evj.a(:com.google.android.gms:45) 
                      at evd.a(:com.google.android.gms:50) 
                      at evc.a(:com.google.android.gms:104) 
                      at com.google.android.gms.auth.account.be.legacy.AuthCronChimeraService.b(:com.google.android.gms:4049) 
                      at ecm.call(:com.google.android.gms:2041) 
                      at java.util.concurrent.FutureTask.run(FutureTask.java:237) 
                      at llt.run(:com.google.android.gms:450) 
                      at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1133) 
                      at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:607) 
                      at lqc.run(:com.google.android.gms:17) 
                      at java.lang.Thread.run(Thread.java:761) 

habe ich einen Haltepunkt, und ich kann sehen, dass die Größe von myMeasureEvi nicht 0 ist, aber aus irgendeinem Grund, geprüft ist immer 0

Irgendwelche Hinweise auf das? wenn Sie mehr Informationen benötigen, bitte lassen Sie mich wissen

EDIT: Kompletter Adaptercode

public class MeasureTableAdapter extends ArrayAdapter<MeasureEvi> { 

private final Activity context; 
ArrayList<MeasureEvi> myMeasureEvi; 
boolean[] checked; 

public OnHeadlineSelectedListener mCallback; 
public interface OnHeadlineSelectedListener { public void onMeasureInDrawActiom(int position, boolean delete); } 
public void setCallback(OnHeadlineSelectedListener mCallback){ this.mCallback = mCallback; } 

public MeasureTableAdapter(Activity context, ArrayList<MeasureEvi> myMeasureEvi) { 
    super(context, R.layout.adapter_tablamedida_item, myMeasureEvi); 

    this.context = context; 
    this.myMeasureEvi = myMeasureEvi; 
    checked= new boolean[myMeasureEvi.size()]; 
} 

private class ViewHolder { 
    TextView txtIndex; 
    EditText txtCoordX; 
    EditText txtCoordY; 
    ImageView imgEvidence; 
    TextView txtEvidence; 
    TextView txtName; 
    TextView txtDescription; 
    CheckBox checkBox; 
} 

@Override 
public View getView(final int position, View rowView, ViewGroup parent){ 
    final ViewHolder holder; 

    LayoutInflater inflater = context.getLayoutInflater(); 

    if(rowView == null) { 
     rowView = inflater.inflate(R.layout.adapter_tablamedida_item, null, true); 
     holder = new ViewHolder(); 

     holder.txtIndex =  (TextView) rowView.findViewById(R.id.TxtIndex); 
     holder.txtCoordX =  (EditText) rowView.findViewById(R.id.TxtCoordX); 
     holder.txtCoordY =  (EditText) rowView.findViewById(R.id.TxtCoordY); 
     holder.imgEvidence = (ImageView) rowView.findViewById(R.id.ImgIcon); 
     holder.txtEvidence = (TextView) rowView.findViewById(R.id.TxtEvidenciaId); 
     holder.txtName =  (TextView) rowView.findViewById(R.id.TxtCategory); 
     holder.txtDescription = (TextView) rowView.findViewById(R.id.TxtDescription); 
     holder.checkBox=  (CheckBox) rowView.findViewById(R.id.checkBox); 

     rowView.setTag(holder); 

    } else { 
     holder= (ViewHolder) rowView.getTag(); 
    } 

    MeasureEvi currentItem = getItem(position); 

    if (currentItem != null) { 
     int suma = currentItem.getmOrderIndex()+1; 
     Evidence myEvidence = DataIpat.evidencetArray.get(currentItem.geteIndex()); 

     holder.checkBox.setChecked(false); 
     if (holder.txtIndex != null) holder.txtIndex.setText("" + suma); 
     if (holder.imgEvidence != null) holder.imgEvidence.setImageDrawable(myEvidence.geteImage().getDrawable()); 
     if (holder.txtEvidence != null) holder.txtEvidence.setText("" + myEvidence.geteId()); 
     if (holder.txtName != null) holder.txtName.setText(myEvidence.geteCategory() + " " + (myEvidence.getcIndex() + 1)); 

     if (holder.txtDescription != null) holder.txtDescription.setText(currentItem.getmDescription() + " - " + currentItem.getmObservation()); 

     if (holder.txtCoordX != null) { 
      holder.txtCoordX.setSelectAllOnFocus(true); 
      holder.txtCoordX.setText("" + currentItem.getmCoordenate().x); 
      holder.txtCoordX.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
       public void onFocusChange(View v, boolean hasFocus) { 
        if (!hasFocus) 
         if(!(setPosition(holder.txtCoordX.getText().toString(), holder.txtCoordY.getText().toString(), position))){ 
          PointF coord = DataIpat.measureEviArray.get(position).getmCoordenate(); 
          holder.txtCoordX.setText("" + coord.x); 
         } 
       } 
      }); 
     } 

     if (holder.txtCoordY != null){ 
      holder.txtCoordY.setSelectAllOnFocus(true); 
      holder.txtCoordY.setText("" + currentItem.getmCoordenate().y); 
      holder.txtCoordY.setOnFocusChangeListener(new View.OnFocusChangeListener() { 
       public void onFocusChange(View v, boolean hasFocus) { 
        if (!hasFocus) 
         if(!(setPosition(holder.txtCoordX.getText().toString(), holder.txtCoordY.getText().toString(), position))){ 
          PointF coord = DataIpat.measureEviArray.get(position).getmCoordenate(); 
          holder.txtCoordY.setText("" + coord.y); 
         } 
       } 
      }); 
     } 
    } 

    if (checked[position]) { 
     holder.checkBox.setChecked(true); 
    } else { 
     holder.checkBox.setChecked(false); 
    } 

    holder.checkBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if(holder.checkBox.isChecked()) 
       checked[position] = true; 
      else 
       checked[position] = false; 
     } 
    }); 

    return rowView; 
} 



private boolean setPosition(String coordX, String coordY, int position){ 
    try { 
     float X = Float.parseFloat(coordX); 
     float Y = Float.parseFloat(coordY); 
     PointF coord = DataIpat.measureEviArray.get(position).getmCoordenate(); 

     if (X != 0 && Y != 0) { // Valido que los x y y sean diferentes de cero 
      if(X != coord.x || Y != coord.y) { // valida que el dato alla cambiado 
       for(MeasureEvi myMeasure: DataIpat.measureEviArray){ // 
        if (myMeasure.geteIndex() == DataIpat.measureEviArray.get(position).geteIndex() 
        && myMeasure.getmIndex() != DataIpat.measureEviArray.get(position).getmIndex()){ 
         if(X == myMeasure.getmCoordenate().x && Y == myMeasure.getmCoordenate().y) { 
          Toast.makeText(getContext(), "Error no se permiten coordenadas iguales.", Toast.LENGTH_SHORT).show(); 
          return false; 
         } 

        } 
       } 
       DataIpat.measureEviArray.get(position).setmCoordenate(new PointF(X, Y)); 
       mCallback.onMeasureInDrawActiom(position, false); // true for delete 
      } 
     } 
     return true; 
    } catch (Exception ex) { 
     return false; 
    } 
} 

} 
+0

Überprüfen Sie die Größe von 'myMeasureEvi' im Konstruktor –

+0

Ja, ich überprüfte, die Größe von myMeasureEvi hängt davon ab, wie viele Objekte ich bei einer vorherigen Aktivität erstellt habe, daher macht es keinen Sinn – Juanca

+0

nach Ihrem Beitrag, kann ich sagen Wenn 'myMeasureEvi.size()' null ist, gibt 'checked [position] 'einen Fehler. –

Antwort

0

Durch ein tieferes Debug an meinem app tun, bemerkte ich, dass der Adapter Art und Weise, bevor sie initialisiert wird, so ist es won't gehen trhough Konstruktor mehr, es sei denn, erneut initialisiert wird, damit die Größe des Arrays immer 0 sein wird

LÖSUNG:

Da das Array für die Größe von selbst fragen, ich beschlossen, eine Arraylist verwenden

erstellen Variable, die die angekreuzte Kästchen zu speichern:

public static ArrayList<MeasureEvi> myChecked = new ArrayList<MeasureEvi>(); 

ein Listener Ereignis erstellen speichern Sie Ihre Auswahl:

holder.checkBox.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      if(holder.checkBox.isChecked()) { 
       myChecked.add(DataIpat.measureEviArray.get(position)); 
      } 
      else { 
       myChecked.remove(DataIpat.measureEviArray.get(position)); 
      } 
      for (int i=0; i<myChecked.size(); i++){ 
       MeasureEvi e= myChecked.get(i); 
       Log.d("mOrder", String.valueOf(e.getmOrderIndex())); 
      } 
     } 
    }); 

und KABOOM, jetzt habe ich die objets von wo ich überprüft!

Verwandte Themen