<Excerpt in index | 首页摘要>
给RecyclerView添加头部和脚部
<The rest of contents | 余下全文>
概述
项目里面一直没有运用到这方面的知识
今天看到这里了就决定搞个demo
先说下原理,
其实难度不大,如果看过ListView的源码就知道。
listview添加头部和脚部就是封装adapter来实现的。
那么我们可以抄袭listview来封装用户的adapter来实现这个添加头部和脚部
实现代码
先模仿ListView
继承自RecyclerView
修改如下:
1 2 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
1 2 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); } } }
|