RecyclerViewのアイテムの間に小さなストリップを追加する必要があります。このストリップは、リスト内の異なる数のアイテムの後に来る可能性があります。これは動的に行う必要があります。 FitBitが行ったことのようなものを実装する必要があります:
ページが下にスクロールしても最初の行、つまり「今週」という行が一番上にくっつく必要があります。
使用 StickyHeaderRecyclerViewライブラリ
とても使いやすい
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
}
}
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のスクロールイベントで処理できます。
このようなRecyclerView
を実装するには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の場合、ヘッダーレイアウトを膨らませて、適切なデータを追加する必要があります。
ハックせずに「適切な」方法でそれを実行したい場合は、独自のLayoutManagerを作成し、それらのケースを手動で処理する必要があります。思ったほど難しくはありませんが、多少の努力が必要です。