2017-02-18 2 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

공유 logcat/error –

+0

logcat 오류가 추가되었습니다. 그게 아무것도 할 수 있을지 모르겠지만, 매개 변수로 정보를 전달하는 대신 데이터베이스에서 직접 가져올 수 있도록 생성자를 다시 작성하려고합니다. 나는 또한 내 사용자 정의 객체에 직접 액세스하여 arraylist가있는 해시 맵에 대한 필요성을 제거하려고합니다. 이 문제가 해결되지 않을 거라는 것을 압니다 만, 그것이 깨지기 쉬운 곳을 추적하는 것이 더 쉬워 질 것입니다. 진행 상황을 업데이트하겠습니다. – knokout1

답변

0

그래서 나는 마침내 해결책을 찾은 것 같았습니다. 어떤 이유에서든 줄을 삭제하면 :

if (convertView == null){ 

(getGroupView와 getChildView 모두에서 수정 됨). getChildView에서 실제로 삭제 한 것이 확실하지는 않지만 좋은 측정을 위해 수행했습니다. 왜 이것이 수정본인지 잘 모르겠지만 문제를 재현하려는 내 시도에는 아직 추락하지 않았습니다.

관련 문제