2017-02-18 9 views
0

エラーが行に表示されるString groceryName = recipeNames.get(parentPosition);エラーの意味を理解していますが、原因を完全には理解していません。奇妙なことに、実際にはグループの一部が拡張されたときにのみ実際に発生します。削除ボタンを押すと、正しい項目が削除されません。つまり、間違ったインデックスを読み込んでいます。すべてのグループが折りたたまれていれば、それはうまく削除されます。どんな助けも大歓迎です。Expandable List Viewグループの位置変数によってインデックスが境界を超えて表示される

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エラーが追加されました。私はそれが何かをするつもりはないと思うが、私はパラメータとして情報を渡す代わりにデータベースから直接引き出すことができるようにコンストラクタを書き直すつもりです。私はまた、私のカスタムオブジェクトに直接アクセスすることによってarraylistを持つハッシュマップの必要性を取り除きたいと思う。私はこれが何かを修正するつもりはないが、それが壊れている場所を追跡するのが少し楽になります。進行状況を更新します。 – knokout1

答えて

0

私は最終的に解決策を見つけたようです。理由を問わず、行を削除する:

if (convertView == null){ 

getGroupViewとgetChildViewの両方から修正されました。私はgetChildViewから実際に何かを削除するかどうかは分かりませんが、私はそれを適切な方法で行いました。私はこれがなぜ修正されたのか分かりませんが、問題を再現しようとする私の試みではまだクラッシュしていません。

関連する問題