<Excerpt in index | 首页摘要> 
给RecyclerView添加头部和脚部
<The rest of contents | 余下全文>  
概述
项目里面一直没有运用到这方面的知识
今天看到这里了就决定搞个demo
先说下原理,
其实难度不大,如果看过ListView的源码就知道。
listview添加头部和脚部就是封装adapter来实现的。
那么我们可以抄袭listview来封装用户的adapter来实现这个添加头部和脚部
实现代码
先模仿ListView
继承自RecyclerView
修改如下:
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 
 | package com.gloomyer.myapplication;
 import android.content.Context;
 import android.support.annotation.Nullable;
 import android.support.v7.widget.RecyclerView;
 import android.util.AttributeSet;
 import android.view.View;
 
 import java.util.ArrayList;
 
 
 
 
 
 public class WrapRecyclerView extends RecyclerView {
 
 ArrayList<View> headers = new ArrayList<>();
 ArrayList<View> footers = new ArrayList<>();
 
 private RecyclerView.Adapter mAdapter;
 
 public WrapRecyclerView(Context context) {
 super(context);
 }
 
 public WrapRecyclerView(Context context, @Nullable AttributeSet attrs) {
 super(context, attrs);
 }
 
 public WrapRecyclerView(Context context, @Nullable AttributeSet attrs, int defStyle) {
 super(context, attrs, defStyle);
 }
 
 @Override
 public void setAdapter(Adapter adapter) {
 if (headers.isEmpty() && footers.isEmpty())
 mAdapter = adapter;
 else
 mAdapter = new WrapAdapter(headers, footers, adapter);
 super.setAdapter(mAdapter);
 }
 
 public void addHeaderView(View view) {
 headers.add(view);
 wrapAdapter();
 }
 
 public void removeHeaderView(View v) {
 headers.remove(v);
 }
 
 public void addFooterView(View v) {
 footers.add(v);
 wrapAdapter();
 }
 
 public void removeFooterView(View v) {
 footers.remove(v);
 }
 
 private void wrapAdapter() {
 if (mAdapter != null) {
 if (!(mAdapter instanceof WrapAdapter)) {
 setAdapter(new WrapAdapter(headers, footers, getAdapter()));
 }
 }
 }
 }
 
 
 | 
这里的难度不大,就是如果用户添加了头部和脚部就封装adapter如果没有就不封装
具体看封装adapter
| 12
 3
 4
 5
 6
 7
 8
 9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
 100
 101
 102
 
 | package com.gloomyer.myapplication;
 import android.support.v7.widget.RecyclerView;
 import android.view.View;
 import android.view.ViewGroup;
 
 import java.util.ArrayList;
 
 
 
 
 
 public class WrapAdapter extends RecyclerView.Adapter {
 public static final int HEADER_TYPE = Integer.MIN_VALUE;
 public static final int FOOTER_TYPE = Integer.MAX_VALUE;
 
 private final RecyclerView.Adapter userAdapter;
 private final ArrayList<View> headers;
 private final ArrayList<View> footers;
 
 public WrapAdapter(ArrayList<View> headers, ArrayList<View> footers, RecyclerView.Adapter adapter) {
 this.userAdapter = adapter;
 this.headers = headers;
 this.footers = footers;
 }
 
 @Override
 public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
 RecyclerView.ViewHolder holder;
 if (viewType >= HEADER_TYPE
 && viewType < (HEADER_TYPE + getHeadersCount())) {
 holder = new WrapHolder(headers.get(viewType - HEADER_TYPE));
 } else if (viewType <= FOOTER_TYPE
 && viewType > (FOOTER_TYPE - getFootersCount())) {
 holder = new WrapHolder(footers.get(FOOTER_TYPE - viewType));
 } else {
 holder = userAdapter.onCreateViewHolder(parent, viewType);
 }
 return holder;
 }
 
 @Override
 public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
 int numHeaders = getHeadersCount();
 if (position < numHeaders)
 return;
 
 
 final int adjPosition = position - numHeaders;
 if (userAdapter != null) {
 int adapterCount = userAdapter.getItemCount();
 if (adjPosition < adapterCount) {
 userAdapter.onBindViewHolder(holder, adjPosition);
 }
 }
 
 
 }
 
 
 @Override
 public int getItemViewType(int position) {
 int numHeaders = getHeadersCount();
 if (position < numHeaders) {
 return HEADER_TYPE + position;
 }
 
 final int adjPosition = position - numHeaders;
 int adapterCount = userAdapter.getItemCount();
 if (userAdapter != null) {
 if (adjPosition < adapterCount) {
 return userAdapter.getItemViewType(adjPosition);
 }
 }
 
 return FOOTER_TYPE - (position - numHeaders - adapterCount);
 }
 
 
 @Override
 public int getItemCount() {
 if (userAdapter != null)
 return userAdapter.getItemCount() + getHeadersCount() + getFootersCount();
 return getHeadersCount() + getFootersCount();
 }
 
 public int getHeadersCount() {
 return headers.size();
 }
 
 public int getFootersCount() {
 return footers.size();
 }
 
 private class WrapHolder extends RecyclerView.ViewHolder {
 
 public WrapHolder(View itemView) {
 super(itemView);
 }
 }
 }
 
 
 |