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)
Fügen Sie Ihr Fehlerprotokoll hinzu –
Freigabe logcat/Fehler –
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