2017-02-18 50 views
0

错误指向行String groceryName = recipeNames.get(parentPosition);我明白错误意味着什么,但我不完全明白是什么造成的。奇怪的是,只有当一些组织扩大时才会发生。当我按下删除按钮时,它不会删除正确的项目,这意味着它正在读取错误的索引。如果所有的组都被折叠,那么删除就好了。任何帮助深表感谢。可扩展列表视图组位置变量导致索引超出范围

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; 
} 
} 

编辑:这是我得到的logcat错误。

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

添加错误日志 –

+0

share logcat/error –

+0

添加了logcat错误。我不确定它会做什么,但我要重写构造函数,以便直接从数据库中提取,而不是将info作为参数传递。我也想通过直接访问我的自定义对象来删除使用ArrayList的hashmap。我知道这不会解决任何问题,但它会让我更容易找到破坏的地方。我会随着进展而更新。 – knokout1

回答

0

所以,我似乎终于找到了解决办法。无论出于何种原因,删除行:

if (convertView == null){ 

从getGroupView和getChildView都修复它。我不确定是否从getChildView中删除它实际上做了什么,但我做了很好的测量。我不知道为什么这是一个解决方案,但它在我试图复制这个问题的尝试中还没有崩溃。