2017-02-18 5 views
0

Der Fehler zeigt auf die Zeile String groceryName = recipeNames.get(parentPosition); Ich verstehe, was der Fehler bedeutet, aber ich verstehe nicht vollständig, was es verursacht. Seltsamerweise passiert es nur wirklich, wenn einige der Gruppen erweitert werden. Wenn ich die Löschtaste drücke, löscht es nicht das korrekte Element, was bedeutet, dass es den falschen Index liest. Wenn alle Gruppen zusammengebrochen sind, wird alles gelöscht. Jede Hilfe wird sehr geschätzt.Expandable Listenansicht Group Position Variable Ursachen Index außerhalb der Grenzen

package groceryproject.jacob.com.recipelist; 

import android.content.Context; 
import android.content.Intent; 
import android.database.sqlite.SQLiteDatabase; 
import android.graphics.Typeface; 
import android.support.v7.widget.RecyclerView; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.BaseExpandableListAdapter; 
import android.widget.Button; 
import android.widget.ExpandableListView; 
import android.widget.TextView; 
import java.util.List; 

public class ExpandableIngredientListAdapter extends BaseExpandableListAdapter{ 
private Context mContext; 
private List<String> recipeNames; // header titles 
private HashMap<String, List<String>> recipeIngredients; 
private Button mDeleteButton; 

public ExpandableIngredientListAdapter(Context context, List<String> listDataHeader, HashMap<String, List<String>> listChildData) { 
    this.mContext = context; 
    this.recipeNames = listDataHeader; 
    this.recipeIngredients = listChildData; 
} 

@Override 
public Object getChild(int groupPosition, int childPosititon) { 
    return this.recipeIngredients.get(this.recipeNames.get(groupPosition)).get(childPosititon); 
} 

@Override 
public long getChildId(int groupPosition, int childPosition) { 
    return childPosition; 
} 

@Override 
public View getChildView(int groupPosition, final int childPosition, 
         boolean isLastChild, View convertView, ViewGroup parent) { 
    //Changed from groupPosition to groupPosition - 1 
    final String childText = (String) getChild(groupPosition, childPosition); 

    if (convertView == null) { 
     LayoutInflater infalInflater = (LayoutInflater) this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = infalInflater.inflate(R.layout.expandable_list_view_item, null); 
    } 

    TextView txtListChild = (TextView) convertView.findViewById(R.id.expandable_list_recipe_ingredient_item); 
    txtListChild.setText(childText); 
    return convertView; 
} 

@Override 
public int getChildrenCount(int groupPosition) { 
    return this.recipeIngredients.get(this.recipeNames.get(groupPosition)).size(); 
} 

@Override 
public Object getGroup(int groupPosition) { 
    return this.recipeNames.get(groupPosition); 
} 

@Override 
public int getGroupCount() { 
    return this.recipeNames.size(); 
} 

@Override 
public long getGroupId(int groupPosition) { 
    return groupPosition; 
} 

@Override 
public View getGroupView(final int groupPosition, boolean isExpanded, View convertView, final ViewGroup parent) { 
    String headerTitle = (String) getGroup(groupPosition); 
    if (convertView == null) { 
     final LayoutInflater infalInflater = (LayoutInflater) this.mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     convertView = infalInflater.inflate(R.layout.expandable_list_view_group, null); 

     mDeleteButton = (Button) convertView.findViewById(R.id.delete_recipe_from_grocery_list_button); 
     //TODO: Add a dialog to ensure user wants to delete the recipe 
     mDeleteButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       int parentPosition = groupPosition; 
       //This is where the error is 
       String groceryName = recipeNames.get(parentPosition); 
       RecipeDB dbHelper = new RecipeDB(parent.getContext()); 
       recipeNames.remove(parentPosition); 
       recipeIngredients.remove(parentPosition); 
       dbHelper.deleteGrocery(groceryName); 
       notifyDataSetChanged(); 

      } 
     }); 
    } 

    TextView lblListHeader = (TextView) convertView.findViewById(R.id.expandable_list_recipe_header); 
    lblListHeader.setTypeface(null, Typeface.BOLD); 
    lblListHeader.setText(headerTitle); 



    return convertView; 
} 

@Override 
public boolean hasStableIds() { 
    return false; 
} 

@Override 
public boolean isChildSelectable(int groupPosition, int childPosition) { 
    return true; 
} 
} 

Edit: Dies ist der Logcat-Fehler, den ich bekomme.

02-17 23:55:19.558 11403-11403/groceryproject.jacob.com.recipelist E/AndroidRuntime: FATAL EXCEPTION: main 
                       Process: groceryproject.jacob.com.recipelist, PID: 11403 
                       java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2 
                        at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
                        at java.util.ArrayList.get(ArrayList.java:308) 
                        at groceryproject.jacob.com.recipelist.ExpandableIngredientListAdapter$1.onClick(ExpandableIngredientListAdapter.java:98) 
                        at android.view.View.performClick(View.java:5204) 
                        at android.view.View$PerformClick.run(View.java:21153) 
                        at android.os.Handler.handleCallback(Handler.java:739) 
                        at android.os.Handler.dispatchMessage(Handler.java:95) 
                        at android.os.Looper.loop(Looper.java:148) 
                        at android.app.ActivityThread.main(ActivityThread.java:5417) 
                        at java.lang.reflect.Method.invoke(Native Method) 
                        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726) 
                        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616) 
+0

Fügen Sie Ihr Fehlerprotokoll hinzu –

+0

Freigabe logcat/Fehler –

+0

Der logcat-Fehler hinzugefügt. Ich bin mir nicht sicher, ob es etwas bewirken wird, aber ich werde den Konstruktor neu schreiben, so dass ich direkt aus der Datenbank ziehen kann, anstatt Informationen als Parameter zu übergeben. Ich möchte auch die Notwendigkeit für eine Hashmap mit Arraylist durch Zugriff auf mein benutzerdefiniertes Objekt direkt entfernen. Ich weiß, dass das nichts reparieren wird, aber es wird es mir ein bisschen leichter machen herauszufinden, wo es bricht. Ich werde mit dem Fortschritt fortfahren. – knokout1

Antwort

0

So schien ich endlich eine Lösung gefunden zu haben. Aus irgendeinem Grund, Löschen der Zeile:

if (convertView == null){ 

von der getGroupView und getChildView behoben. Ich bin mir nicht sicher, ob das Löschen von getChildView tatsächlich etwas bewirkt hat, aber ich habe es für ein gutes Maß getan. Ich habe keine Ahnung, warum dies eine Fehlerbehebung war, aber es ist noch nicht abgestürzt bei meinen Versuchen, das Problem zu replizieren.

Verwandte Themen