web-dev-qa-db-ja.com

AndroidでRecyclerViewのアイテムの間に動的ビューを追加するにはどうすればよいですか?

RecyclerViewのアイテムの間に小さなストリップを追加する必要があります。このストリップは、リスト内の異なる数のアイテムの後に来る可能性があります。これは動的に行う必要があります。 FitBitが行ったことのようなものを実装する必要があります: enter image description here

ページが下にスクロールしても最初の行、つまり「今週」という行が一番上にくっつく必要があります。

16
Sid

使用 StickyHeaderRecyclerViewライブラリ

とても使いやすい

2
Bhawna Raheja

getItemViewType(int) を使用して、さまざまなビュータイプの概念を使用する必要があります。次に onCreateViewHolder(ViewGroup、int) で、膨張/作成する必要があるタイプを確認できます。

例:

@Override
public int getItemViewType(int position) {
    // you should return the view type, based on your own dynamic logic
}

@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
     switch (viewType) {
         // handle each view type accordingly
     }
}
6
thiagolr

getItemViewType()を使用するだけで、RecyclerViewで複数のビュータイプの概念を使用でき、onCreateViewHolder()のviewTypeパラメータを処理できます。

たとえば、以下のモデルを使用できます。

    public class Data{
           int field1;
           float filed2;
           int rowType // 1,2,2,...N this will fill by you whenever you will    
                       //creating arraylist for your recyclerview
     }


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

    ArrayList<Data> mItems;

    class ViewHolderRowType1 extends RecyclerView.ViewHolder {
        ...
    }

    class ViewHolderRowType2 extends RecyclerView.ViewHolder {
        ...
    }

    ....
    class ViewHolderRowTypeN extends RecyclerView.ViewHolder {
        ...
    }

    @Override
    public int getItemViewType(int position) {
        return mItems.get(position).rowType; 
        //or
        //return positon%2; // This will based on your condition        
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         switch (viewType) {
             case 0: return new ViewHolderRowType0(...);
             case 1: return new ViewHolderRowType1(...);
             ...
             case N: return new ViewHolderRowTypeN(...);
         }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder vh, int position) {

    //Just check which view type is going to bind and then fill the data accordingly in your rows


      if(vh instanceof ViewHolderRowType1){
       // Fill the data for first view type


      } else if (vh instanceof ViewHolderRowType2) {
       // Fill the data for second view type


      } else if (vh instanceof ViewHolderRowTypeN){
       // Fill the data for Nth view type


      }

    }

スティッキーな「このビューは弱い」場合は、RecyclerViewの上に追加して、RecyclerViewのスクロールイベントで処理できます。

0

このようなRecyclerViewを実装するには2つの方法があります。

  1. すべてのレイアウトにヘッダーを追加し、要件に基づいて非表示/表示します(推奨)。
  2. または、ヘッダーとコンテンツに2つの異なるレイアウトを使用します(アダプター内のアイテムの総数に問題が発生する可能性があるため、推奨されません)。

カスタムPOJO/GetterSetterクラスで、ヘッダーを表示するかどうかを識別するために、headerStatus(booleanまたはintのいずれか)に1つのフィールドを追加します。

アダプターのオーバーライドpublic int getItemViewType(int position)になりました。

_static final int TYPE_ITEM = 0;
static final int TYPE_SEPARATOR = 1;
@Override
public int getItemViewType(int position) {
        if (mData.get(position).getHeaderStatus() == 0)
                return TYPE_ITEM;
        else
                return TYPE_SEPARATOR;
}_

getView()でレイアウトをインフレートするときに、次の方法で行タイプを確認できます

int rowType = getItemViewType(position);

ケース1の場合、ヘッダーを表示して、適切なデータを設定する必要があります。ケース2の場合、ヘッダーレイアウトを膨らませて、適切なデータを追加する必要があります。

0
Arth Tilva

ハックせずに「適切な」方法でそれを実行したい場合は、独自のLayoutManagerを作成し、それらのケースを手動で処理する必要があります。思ったほど難しくはありませんが、多少の努力が必要です。

0
Kaerdan