可扩展列表视图组位置变量导致索引超出范围

时间:2017-02-18 05:27:11

标签: java android expandablelistview

错误指向行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)

1 个答案:

答案 0 :(得分:0)

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

if (convertView == null){
来自getGroupView和getChildView的

修复了它。我不确定是否从getChildView中删除它实际上做了什么,但我做得很好。我不知道为什么这是一个修复,但在我尝试复制问题时它还没有崩溃。