package com.qesion.mianla.module.adapter;
import android.support.v7.widget.RecyclerView;
import android.view.ViewGroup;
/**
* 含有头布局和脚布局的RecyclerViewAdapter
*/
public abstract class HeaderAndFooterRecyclerViewAdapter
<
HeaderViewHolder extends RecyclerView.ViewHolder,
ContentItemViewHolder extends RecyclerView.ViewHolder,
FooterViewHolder extends RecyclerView.ViewHolder
>
extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
public static final int ITEM_TYPE_HEADER = 0xFFFFFF00;
public static final int ITEM_TYPE_CONTENT = 0xFFFFFF01;
public static final int ITEM_TYPE_FOOTER = 0xFFFFFF02;
public abstract int getHeaderCount();
public abstract int getContentItemCount();
public abstract int getFooterCount();
public abstract HeaderViewHolder onCreateHeaderViewHolder(ViewGroup parent);
public abstract ContentItemViewHolder onCreateContentItemViewHolder(ViewGroup parent, int viewType);
public abstract FooterViewHolder onCreateFooterViewHolder(ViewGroup parent);
public abstract void onBindHeaderViewHolder(HeaderViewHolder holder, int position);
public abstract void onBindContentItemViewHolder(ContentItemViewHolder holder, int position);
public abstract void onBindFooterViewHolder(FooterViewHolder holder, int position);
public boolean isHeaderView(int absPosition) {
int headerCount = getHeaderCount();
return headerCount != 0 && absPosition < headerCount;
}
public boolean isFooterView(int absPosition) {
return getFooterCount() != 0 && absPosition >= getHeaderCount() + getContentItemCount();
}
public boolean isContentItemView(int absPosition) {
return !isHeaderView(absPosition) && !isFooterView(absPosition);
}
public int getHeaderPosition(int absPosition) {
if (isHeaderView(absPosition)) {
return absPosition;
} else {
throw new IllegalArgumentException("position : " + absPosition + " is not a header view!");
}
}
public int getContentItemPosition(int absPosition) {
if (isContentItemView(absPosition)) {
return absPosition - getHeaderCount();
} else {
throw new IllegalArgumentException("absPosition : " + absPosition + " is not a content item view!");
}
}
public int getFooterPosition(int absPosition) {
if (isFooterView(absPosition)) {
return absPosition - getHeaderCount() - getContentItemCount();
} else {
throw new IllegalArgumentException("position : " + absPosition + " is not a footer view!");
}
}
@Override
public int getItemViewType(int absPosition) {
if (isHeaderView(absPosition)) {
return ITEM_TYPE_HEADER;
} else if (isFooterView(absPosition)) {
return ITEM_TYPE_FOOTER;
} else {
return ITEM_TYPE_CONTENT;
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
switch (viewType) {
case ITEM_TYPE_HEADER:
return onCreateHeaderViewHolder(parent);
case ITEM_TYPE_FOOTER:
return onCreateFooterViewHolder(parent);
default:
return onCreateContentItemViewHolder(parent, viewType);
}
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int absPosition) {
int viewType = getItemViewType(absPosition);
switch (viewType){
case ITEM_TYPE_HEADER:
HeaderViewHolder headerViewHolder = (HeaderViewHolder) holder;
int headerPosition = getHeaderPosition(absPosition);
onBindHeaderViewHolder(headerViewHolder, headerPosition);
break;
case ITEM_TYPE_FOOTER:
FooterViewHolder footerViewHolder = (FooterViewHolder) holder;
int footerPosition = getFooterPosition(absPosition);
onBindFooterViewHolder(footerViewHolder, footerPosition);
break;
default:
ContentItemViewHolder contentItemViewHolder = (ContentItemViewHolder) holder;
int contentItemPosition = getContentItemPosition(absPosition);
onBindContentItemViewHolder(contentItemViewHolder, contentItemPosition);
break;
}
}
@Override
public int getItemCount() {
return getHeaderCount() + getContentItemCount() + getFooterCount();
}
}
HeaderAndFooterRecyclerViewAdapter
最新推荐文章于 2024-04-03 21:40:56 发布