2016-04-09 8 views
1

私は、セクションとサブヘッダでrecyclerviewを実装しようとしています。私はGithubのGabriele Mariottiによって素晴らしいクラスを見つけましたが、私はそれを実装するいくつかの問題を抱えています。基本的には、私の定期的なrecyclerviewアダプタを例の代わりに使用すると、各セクションヘッダーが私のrecyclerviewの1つの要素を置き換えます。sectioned recyclerview

たとえば、私はrecyclerviewの中に5枚のカード(調理アプリとして5つの成分)を持っていますが、2枚のヘッダーを追加した後、1枚目と4枚目をサブヘッダーに置き換えた3枚のカードが残っています。私はこれが理にかなってほしい。また、私のカードの位置がすべて乱れていると、私はrecyclerviewの底にスクロールすると、アプリケーションがクラッシュします。うまくいけば誰かが私を正しい方向に向けることができるように、私はいくつかのコード行を付けています。 Mariottiの例と比較すると、私は基本的にだけではなく、「simpleadapter.java」クラスの自分のアダプターを使用しています:

public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolders> { 

private List<Ingredient> itemList; 
private final String TAG = OrderFragment.class.getSimpleName(); 
private Context context; 

public RecyclerViewAdapter(Context context, List<Ingredient> itemList) { 
    this.itemList = itemList; 
    this.context = context; 
} 

public class RecyclerViewHolders extends RecyclerView.ViewHolder{ 
    public RecyclerViewHolders(View itemView) { 
     super(itemView); 
    } 
} 

public class ingredientViewHolder extends RecyclerViewHolders{ 

    public TextView ingredientName; 
    public ImageView ingredientPhoto; 
    public ImageButton infoBtn; 
    public Button regularBtn; 
    public Button extraBtn; 
    public ImageView soldOutPhoto; 
    public ImageView grayOutPhoto; 
    private Context context; 

    public ingredientViewHolder(View itemView) { 
     super(itemView); 
     ingredientName = (TextView)itemView.findViewById(R.id.ingredient_name); 
     ingredientPhoto = (ImageView)itemView.findViewById(R.id.ingredient_photo); 
     infoBtn = (ImageButton) itemView.findViewById(R.id.info); 
     regularBtn = (Button) itemView.findViewById(R.id.regular); 
     extraBtn = (Button) itemView.findViewById(R.id.extra); 
     soldOutPhoto = (ImageView) itemView.findViewById(R.id.sold_out); 
     grayOutPhoto = (ImageView) itemView.findViewById(R.id.gray_out); 
    } 
} 

@Override 
public RecyclerViewHolders onCreateViewHolder(ViewGroup parent, int viewType) { 
    View layoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.ingredient, null); 
    return new ingredientViewHolder(fragment, layoutView); 
} 

@Override 
public void onBindViewHolder(RecyclerViewHolders viewHolder, final int pos) { 
    ingredientViewHolder holder = (ingredientViewHolder) viewHolder; 

    final int position = holder.getAdapterPosition(); 
    final String name = itemList.get(position).getName(); 

    if (MainActivity.order.get(position) == 1) { 
     holder.regularBtn.setSelected(true); 
     holder.extraBtn.setSelected(false); 
    } else if (MainActivity.order.get(position) == 2) { 
     holder.regularBtn.setSelected(false); 
     holder.extraBtn.setSelected(true); 
    } else { 
     holder.regularBtn.setSelected(false); 
     holder.extraBtn.setSelected(false); 
    } 

    holder.ingredientName.setText(itemList.get(position).getName()); 

} 

@Override 
public int getItemCount() { 
    return this.itemList.size(); 
} 
} 

そして、ここでは、私は私のフラグメント内でこのrecyclerviewを呼び出しています方法です:

 final RecyclerView rView = (RecyclerView) v.findViewById(R.id.recycler_view); 
    rView.setHasFixedSize(true); 
    rView.setLayoutManager(new GridLayoutManager(getActivity(), 3)); 

    //Your RecyclerView.Adapter 
    RecyclerView.Adapter rcAdapter = new RecyclerViewAdapter(getActivity(), visibleIngredients); 
    //This is the code to provide a sectioned grid 
    List<SectionedGridRecyclerViewAdapter.Section> sections = 
      new ArrayList<SectionedGridRecyclerViewAdapter.Section>(); 

    //Sections 
    sections.add(new SectionedGridRecyclerViewAdapter.Section(0,"Spreads")); 
    sections.add(new SectionedGridRecyclerViewAdapter.Section(2,"Liquid")); 

    //Add your adapter to the sectionAdapter 
    SectionedGridRecyclerViewAdapter.Section[] dummy = new SectionedGridRecyclerViewAdapter.Section[sections.size()]; 
    SectionedGridRecyclerViewAdapter mSectionedAdapter = new 
      SectionedGridRecyclerViewAdapter(getActivity(),R.layout.section,R.id.section_text,rView,rcAdapter); 
    mSectionedAdapter.setSections(sections.toArray(dummy)); 

    //Apply this adapter to the RecyclerView 
    rView.setAdapter(mSectionedAdapter); 
+0

スタックトレースを送信 – fractalwrench

答えて

0

問題を解明私はそれを無視し、代わりに、それはすべて良かったリターンを機能位置を使用すると

final int position = holder.getAdapterPosition(); 

:私は次の行を使用していたonBindViewHolder内部のための位置のように見えるがオフになっていました。