2016-06-29 11 views
2

このexampleのようなBig Nerd RanchによるExpandableRecyclerViewを使用しています。この問題は、RecyclerViewに別のサブアイテムを追加しようとするたびに、この新しいアイテムのスペースが既に存在していたアイテムのスペースを占有します。上の写真はaddinga新しいサブ項目の前にリストを示しExpandableRecyclerViewに子アイテムを追加する

enter image description here

:私はより良いそれを説明する方法がわからないので、私は、次のスクリーンショットを添付しました。私は、追加ボタンをクリックすると、私は子ビューを崩壊し、それが怒鳴るように表示されますので、それを再度展開する必要があります。

enter image description here

新規アイテムビューは、そのスペースを占有し、他の子ビューを押し下げ一度項2のためだったと私は最後の親項目に新しい子項目を追加しようとした場合には、このエラーを与える:

E/AndroidRuntime: FATAL EXCEPTION: main 
               Process: com.dietando.gabriel.dietando, PID: 4037 
                     java.lang.IndexOutOfBoundsException: Invalid index 8, size is 8 
                      at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255) 
                      at java.util.ArrayList.remove(ArrayList.java:403) 
                      at com.bignerdranch.expandablerecyclerview.Adapter.ExpandableRecyclerAdapter.expandParent(ExpandableRecyclerAdapter.java:319) 
                      at com.bignerdranch.expandablerecyclerview.Adapter.ExpandableRecyclerAdapter.onParentItemClickListener(ExpandableRecyclerAdapter.java:252) 
                      at com.bignerdranch.expandablerecyclerview.ViewHolder.ParentViewHolder.onClick(ParentViewHolder.java:200) 
                      at android.view.View.performClick(View.java:5198) 
                      at android.view.View$PerformClick.run(View.java:21147) 
                      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) 

私は新しいサブ項目を追加すると、私は私の配列に新しい項目を追加リストを開き、メソッドnotifyDataSetChanged()を呼び出します。ここで

は私のアダプターのコードです:ここで

public class MealExpandableAdapter extends ExpandableRecyclerAdapter<MealParentViewHolder, MealChildViewHolder> 
{ 
    private Context context; 
    private List<ParentObject> refeicoes; 
    private boolean[] checkedState; 
    private LayoutInflater mInflater; 
    private MealExpandableAdapter.MealChildViewHolderListener onChildCheckChangedListener; 

    public interface MealChildViewHolderListener 
    { 
     public void onCheckChange(int mealNumber, Food food, boolean selected); 
    } 

    public MealExpandableAdapter(Context context, List<ParentObject> refeicoes) 
    { 
     super(context, refeicoes); 

     this.context = context; 
     this.refeicoes = refeicoes; 
     mInflater = LayoutInflater.from(context); 

     checkedState = new boolean[refeicoes.size()]; 

     for(int i = 0; i < checkedState.length; ++i) 
      checkedState[i] = false; 


    } 

    protected void setOnChilCheckedChangedListener(MealExpandableAdapter.MealChildViewHolderListener onChildCheckChangedListener) 
    { 
     this.onChildCheckChangedListener = onChildCheckChangedListener; 
    } 

    @Override 
    public MealParentViewHolder onCreateParentViewHolder(ViewGroup viewGroup) 
    { 
     View view = mInflater.inflate(R.layout.adapter_refeicao, viewGroup, false); 
     return new MealParentViewHolder(view); 
    } 

    @Override 
    public MealChildViewHolder onCreateChildViewHolder(ViewGroup viewGroup) 
    { 
     View view = mInflater.inflate(R.layout.adapter_refeicao_child, viewGroup, false); 
     return new MealChildViewHolder(view); 
    } 

    @Override 
    public void onBindParentViewHolder(MealParentViewHolder mealParentViewHolder, final int mealNumber, Object parentObject) 
    { 
     final Meal meal = (Meal) parentObject; 
     mealParentViewHolder.mMealParentTextView.setText(meal.getNome()); 
     mealParentViewHolder.mMealParentImageButton.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       Log.i("Teste", "img btn click"); 
       meal.addFood(0, new Food("New item", 30, 30, 30)); 
       //notify(); 
       //notifyItemInserted(mealNumber); 
       notifyDataSetChanged(); 
       notifyItemChanged(mealNumber); 


      } 
     }); 

    } 

    @Override 
    public void onBindChildViewHolder(final MealChildViewHolder mealChildViewHolder, final int mealNumber, Object childObject) 
    { 
     //final Meal meal = (Meal) refeicoes.get(mealNumber); 
     final Food food = (Food) childObject; 
     mealChildViewHolder.mMealChildTextView.setText(food.getName()); 
     mealChildViewHolder.mMealChildCheckBox.setChecked(food.isChecked()); 
     mealChildViewHolder.mMealChildCheckBox.setChecked(food.isChecked()); 
     mealChildViewHolder.mMealChildCheckBox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (((CheckBox) v).isChecked()) { 
        Log.i("Teste", "checked"); 
        food.checkFood(); 
        onChildCheckChangedListener.onCheckChange(mealNumber, food, true); 
       } else { 
        Log.i("Teste", "unchecked"); 
        food.checkFood(); 
        onChildCheckChangedListener.onCheckChange(mealNumber, food, false); 
       } 
      } 

     }); 
    } 

は私ParentViewHolderです:

public class MealParentViewHolder extends ParentViewHolder 
{ 
    public TextView mMealParentTextView; 
    public ImageButton mMealParentImageButton; 
    public CheckBox mMealParentCheckBox; 

    public MealParentViewHolder(View itemView) 
    { 
     super(itemView); 

     mMealParentTextView = (TextView) itemView.findViewById(R.id.tTitle); 
     mMealParentImageButton = (ImageButton) itemView.findViewById(R.id.imgBtnParent); 
     mMealParentCheckBox = (CheckBox) itemView.findViewById(R.id.checkBox); 
    } 
} 

そして、ここでは、私はViewHolderをinitalizingてる方法です私のChildViewHolder

public class MealChildViewHolder extends ChildViewHolder 
{ 
    public TextView mMealChildTextView; 
    public CheckBox mMealChildCheckBox; 



    public MealChildViewHolder(View itemView) 
    { 
     super(itemView); 


     mMealChildTextView = (TextView) itemView.findViewById(R.id.txtFragMeal); 
     mMealChildCheckBox = (CheckBox) itemView.findViewById(R.id.checkBoxFragMeal); 
     mMealChildCheckBox.setChecked(false); 
     mMealChildCheckBox.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (((CheckBox) v).isChecked()) { 
        Log.i("Teste", "checked"); 

       } else { 


       } 
      } 
     }); 
    } 
} 

です私の断片:

RecyclerView recyclerView = (RecyclerView) getView().findViewById(R.id.recyclerView); 
     recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); 

     meals = user.getDiet().getMeals(); 

     MealExpandableAdapter mMealExpandableAdapter = new MealExpandableAdapter(getActivity(), meals); 
     mMealExpandableAdapter.setOnChilCheckedChangedListener(onChildCheckChangedListener()); 
     // mCrimeExpandableAdapter.setCustomParentAnimationViewId(R.id.parent_list_item_expand_arrow); 
     mMealExpandableAdapter.setParentClickableViewAnimationDefaultDuration(); 
     mMealExpandableAdapter.setParentAndIconExpandOnClick(true); 


     recyclerView.setAdapter(mMealExpandableAdapter); 

アダプターの問題だと思いますが、何が間違っているのか分かりません。何か助けていただければ幸いです。

答えて

0

私はこの問題は、このラインの周りで賭ける:

checkedState = new boolean[refeicoes.size()];

配列は0ベースです。

5つの要素を含むリストは、6つのエントリを持つ配列を作成します。配列の長さを反復しようとすると、ArrayIndexOutOfBoundsExceptionが得られます。なぜなら、配列には期待していたよりも少ないエントリしか含まれていないからです。

+0

アイテム2から画面内のスペースを占める新しいサブアイテムはどうなりますか? –

+0

関連性があるかもしれません。インデックス作成に問題があるようです。 – Emmanuel

+0

しかし、 'refeicoes'はサブアイテムではなくアイテムのリストなので、' refeicoes.size() 'という別のサブアイテムを追加すると変更されません。それとも? –

関連する問題