AndroidRecyclerView添加头部和底部实例详解
Android RecyclerView添加头部和底部实例详解
如果只是想添加头部,可是使⽤GitHub⾥⾯这个项⽬,它可以为LinearLayoutManager,GridLayoutManager
,StaggeredGridLayoutManager布局的RecyclerView添加header。使⽤起来也⼗分简单;
只需将RecyclerViewHeader布局放在RecyclerView的上层。
<FrameLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycler"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal|top" />
<lerviewheader.RecyclerViewHeader
android:id="@+id/header"
android:layout_width="match_parent"
android:layout_height="100dp"
android:layout_gravity="center_horizontal|top">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:text="header"/>
</lerviewheader.RecyclerViewHeader>
</FrameLayout>
然后获得RecyclerViewHeader对象:
RecyclerViewHeader header = (RecyclerViewHeader) findViewById(R.id.header);
把RecyclerViewHeader赋予RecyclerView
RecyclerView recyclerView = (RecyclerView) findViewById(ler_view);
// set LayoutManager for your RecyclerView
header.attachTo(recyclerView, true);
注意事项
RecyclerViewHeader必须在RecyclerView设置了LayoutManager之后调⽤。
⽬前该库适⽤于LinearLayoutManager,StaggeredGridLayoutManager和GridLayoutManager布局的RecyclerViews。只⽀持垂直布局LayoutManager。如果你打算在RecyclerView中使⽤setOnScrollListener(…)⽅法,确保在setOnScrollListener(…)的attachTo(…)⽅法之前使⽤。
当然我们也可以⾃⼰写⼀个添加头部和底部的RecyclerView。它实现的基本原理也是通过getItemViewType⽅法返回不同的类型来添加头部和底部。
⾸先我们⾃定义⼀个RecyclerView:
public class WrapRecyclerView extends RecyclerView {
public ArrayList<View> mHeaderViews = new ArrayList<>();
public ArrayList<View> mFooterViews = new ArrayList<>();
//添加Adapter
public Adapter mAdapter;
public WrapRecyclerView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public WrapRecyclerView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public WrapRecyclerView(Context context) {
super(context);
}
public void addHeaderView(View view){
mHeaderViews.clear();
mHeaderViews.add(view);
if(mAdapter!=null){
if(!(mAdapter instanceof RecyclerWrapAdapter)){
mAdapter = new RecyclerWrapAdapter(mHeaderViews,mFooterViews,mAdapter);
}
}
}
public void addFooterView(View view){
mFooterViews.clear();
mFooterViews.add(view);
if(mAdapter!=null){
if(!(mAdapter instanceof RecyclerWrapAdapter)){
mAdapter = new RecyclerWrapAdapter(mHeaderViews,mFooterViews,mAdapter);
}
}
}
public void setAdapter(Adapter adapter){
if (mHeaderViews.isEmpty()&&mFooterViews.isEmpty()){
super.setAdapter(adapter);
}else {
adapter = new RecyclerWrapAdapter(mHeaderViews,mFooterViews,adapter) ;
super.setAdapter(adapter);
}
mAdapter = adapter ;
}
}
我们会看到我们有⼀个RecyclerWrapAdapter没有实现,下⾯我们就来看下RecyclerWrapAdapter,这个也是实现添加头部和尾部的关键。
public class RecyclerWrapAdapter extends RecyclerView.Adapter implements WrapperAdapter{
private RecyclerView.Adapter mAdapter;
private ArrayList<View> mHeaderViews;
private ArrayList<View> mFootViews;
static final ArrayList<View> EMPTY_INFO_LIST =
new ArrayList<View>();
private int mCurrentPosition;
public RecyclerWrapAdapter(ArrayList<View> mHeaderViews, ArrayList<View> mFootViews, RecyclerView.Adapter mAdapter){
this.mAdapter = mAdapter;
if (mHeaderViews == null) {
this.mHeaderViews = EMPTY_INFO_LIST;
} else {
this.mHeaderViews = mHeaderViews;
}
if (mFootViews == null) {
this.mFootViews = EMPTY_INFO_LIST;
} else {
this.mFootViews = mFootViews;
}
}
public int getHeadersCount() {
return mHeaderViews.size();
}
public int getFootersCount() {
return mFootViews.size();
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == RecyclerView.INVALID_TYPE) {
return new (0));
} else if (viewType == RecyclerView.INVALID_TYPE - 1) {
return new (0));
}
CreateViewHolder(parent, viewType);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {    //如果头部不为空,那么我们就要先添加头部,所以我们只要
//把前⾯⼏个position给头部,当position⼩于头部总数的时候,
//我们返回头部view。再判断原Adapter 的 count 与当前 position
// 的差值来⽐较,是调⽤原 Adapter 的 getView ⽅法,还是获取 footView
// 的 view。
int numHeaders = getHeadersCount();
if (position < numHeaders) {
return;
}
int adjPosition = position - numHeaders;
int adapterCount = 0;
if (mAdapter != null) {
adapterCount = ItemCount();
if (adjPosition < adapterCount) {
return;
}
}
}
@Override
public int getItemCount() {
if (mAdapter != null) {
return getHeadersCount() + getFootersCount() + ItemCount();    } else {
return getHeadersCount() + getFootersCount();
}
}
@Override
public RecyclerView.Adapter getWrappedAdapter() {
return mAdapter;
}
@Override
public int getItemViewType(int position) {
//增加两个类型
//RecyclerView.INVALID_TYPE 添加头部
android layout布局//RecyclerView.INVALID_TYPE-1 添加尾部
//如果头部不为空,那么我们就要先添加头部,所以我们只要
//把前⾯⼏个position给头部,当position⼩于头部总数的时候,
/
/我们返回头部类型。再判断原Adapter 的 count 与当前 position
// 的差值来⽐较,是调⽤原 Adapter 的类型,还是获取 footView
// 的类型。
mCurrentPosition = position ;
int numHeaders = getHeadersCount();
if(position<numHeaders){
return RecyclerView.INVALID_TYPE ;
}
int adjPosition = position - numHeaders ;
int adapterCount = 0 ;
if(mAdapter!=null){
adapterCount = ItemCount() ;
if(adjPosition < adapterCount){
ItemViewType(adjPosition);
}
}
return RecyclerView.INVALID_TYPE - 1;
}
private static class HeaderViewHolder extends RecyclerView.ViewHolder {    public HeaderViewHolder(View itemView) {
super(itemView);
}
}
}
我们还可以实现⼀个接⼝,来调⽤RecyclerWrapAdapter对象:public interface WrapperAdapter {
public RecyclerView.Adapter getWrappedAdapter() ;
}
这样我们就可以把RecyclerView布局改成WrapRecyclerView就可以了,然后调⽤addHeaderView或者addFooterView就可以添加头部和尾部了。
感谢阅读,希望能帮助到⼤家,谢谢⼤家对本站的⽀持!

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。