1

2つの行にGridLayoutManagerを持つrecyclerViewを作成し、最初の要素を残りの部分よりも大きくする必要があります。結果は次のようになります。 enter image description hereGridLayoutManagerと異なるviewHolderを持つ最初の要素

私はこれを達成することができましたが、これはまったく新しい方法です。私のrecyclerViewアダプタでは、最初の要素のために別のviewHolderを使用します。それは素晴らしい解決策でしたが、2番目の要素は最初の要素の下に行きました。だから私は、最初の要素と同じように固定された高さをrecyclerViewに与えるというトリックを作りました。最初の要素と2番目の要素が重なってしまい、2番目の要素が見えるようにするだけです。

@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    switch (viewType) { 
     case 0: 
      final View view = inflater.inflate(R.layout.big_item, parent, false); 
      return new BigViewHolder(view); 
     case 2: 
      final View view2 = inflater.inflate(R.layout.normal_item, parent, false); 
      return new NormalViewHolder(view2); 
     default: 
      return null; 
    } 
} 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    if (position == 1) { 
     holder.itemView.setVisibility(View.GONE); 
    }} 

@Override 
public int getItemViewType(int position) { 
    if (position == 0) { 
     return 0; 
    } else return 2; 
} 

しかし、私は特にこのアプローチが嫌いです。誰かがこれについてより良いアイデアを持っていますか?

+0

['GridLayoutManager.SpanSizeLookup'](https://developer.android.com/reference/android/support/v7/widget/GridLayoutManager.SpanSizeLookup.html)。最初の項目は2、残りは1を返すことができます。 –

+0

@MikeM。私はこれをどのように達成できるかの例を私に教えてもらえますか? setSpanSizeAtPosition()メソッドなどを見つけることができません。ありがとう – Phantom

+0

ああ、ええ、申し訳ありませんが、私は方法を指定するのを忘れました。 'SpanSizeLookup'のサブクラスを作成し、' getSpanSize(int position) 'メソッドを' position == 0 'の場合は 'return 2;'に置き換え、残りの場合は 'return 1;'メソッドをオーバーライドします。次に、 'GridLayoutManager'でそのインスタンスを設定します。あなたは 'OnClickListener'のようにすべて匿名で行うことができます。簡単な例:https://drive.google.com/file/d/1K3HCdetp0M8vT8M55pOO0pr7aMWZHyjJ/view?usp=drivesdk –

答えて

3

いくつかの掘削と相談の後、私はかなり良い結果になりました。私は以下のことを掲載します。私は質問で述べたように

まず、アダプタが見えるはずです、第二の要素の隠れなし:

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    public static final int TYPE_FIRST_ITEM = 0; 
    public static final int TYPE_ITEM = 1; 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     switch (viewType) { 
      case TYPE_FIRST_ITEM: 
       final View view = inflater.inflate(R.layout.big_item, parent, false); 
       return new BigViewHolder(view); 
      case TYPE_ITEM: 
       final View view2 = inflater.inflate(R.layout.normal_item, parent, false); 
       return new NormalViewHolder(view2); 
      default: 
       return null; 
     } 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
     switch (holder.getItemViewType()) { 
      case TYPE_FIRST_ITEM: 
       BigViewHolder bigViewHolder = (BigViewHolder) holder; 
       // Do what you need for the first item 
       break; 
      case TYPE_ITEM: 
       NormalViewHolder normalViewHolder = (NormalViewHolder) holder; 
       // Do what you for the other items 
       break; 
     } 
    } 

    @Override 
    public int getItemViewType(int position) { 
     if (position == 0) { 
      return TYPE_FIRST_ITEM; 
     } else return TYPE_ITEM; 
    } 

    final class NormalViewHolder extends RecyclerView.ViewHolder { 
     public NormalViewHolder(View itemView) { 
      super(itemView); 
     } 
     // find your views here 
    } 

    final class BigViewHolder extends RecyclerView.ViewHolder { 
     public BigViewHolder(View itemView) { 
      super(itemView); 
     } 
     // find your views here 
    } 
} 

第二に、レイアウトマネージャはどのように指定するには、リスナーを実装する必要があります多くのスパン(行)は特定の位置にある必要があります。

RecyclerView mRecyclerView = view.findViewById(R.id.my_recycler_view); 
     MyAdapter mAdapter = new MyAdapter(); 
     GridLayoutManager mLayoutManager = new GridLayoutManager(getActivity(), 2, LinearLayoutManager.HORIZONTAL, false); 
     mLayoutManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() { 
      @Override 
      public int getSpanSize(int position) { 
       switch(mAdapter.getItemViewType(position)){ 
        case MyAdapter.TYPE_FIRST_ITEM: 
         return 2; 
        case MyAdapter.TYPE_ITEM: 
         return 1; 
        default: 
         return -1; 
       } 
      } 
     }); 
     mRecyclerView.setAdapter(mAdapter); 
     mRecyclerView.setLayoutManager(mLayoutManager); 

他の人にも役立つことを願っています。ご協力いただきありがとうございますMike M.

関連する問題