package com.taro.headerrecycle.adapter;
import android.support.annotation.NonNull;
import android.support.v4.util.ArrayMap;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import com.taro.headerrecycle.stickerheader.StickHeaderItemDecoration;
import com.taro.headerrecycle.layoutmanager.HeaderSpanSizeLookup;
import java.util.AbstractMap;
import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.Set;
/**
* Created by taro on 16/5/19.
*/
public class ExtraViewWrapAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements StickHeaderItemDecoration.IStickerHeaderDecoration, HeaderSpanSizeLookup.ISpanSizeHandler {
public static final int VIEW_HEADER_REFRESH = Integer.MAX_VALUE / 3;
public static final int VIEW_FOOTER_LOAD_MORE = Integer.MIN_VALUE / 3;
private HeaderFooterViewCache mHeaderOption = null;
private HeaderFooterViewCache mFooterOption = null;
private StickHeaderItemDecoration.IStickerHeaderDecoration mIStickHeaderDecoration = null;
private HeaderSpanSizeLookup.ISpanSizeHandler mISpanSizeLookup = null;
private View mRefreshHeader = null;
private View mLoadMoreFooter = null;
private boolean mIsRefreshing = false;
private boolean mIsLoading = false;
private RecyclerView.Adapter mInnerAdapter;
private boolean mIsFootViewEnable = true;
private boolean mIsHeaderViewEnable = true;
public static final void setRrefreshingViewStatus(boolean isRefreshing, boolean isScrollToStart, RecyclerView recyclerView) {
if (recyclerView == null) {
return;
} else {
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter != null && adapter instanceof ExtraViewWrapAdapter) {
ExtraViewWrapAdapter wrapAdapter = (ExtraViewWrapAdapter) adapter;
wrapAdapter.setRefreshingStatus(isRefreshing);
if (isScrollToStart) {
recyclerView.scrollToPosition(0);
}
}
}
}
public static final void setLoadingViewStatus(boolean isLoading, boolean isScrollToEnd, RecyclerView recyclerView) {
if (recyclerView == null) {
return;
} else {
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter != null && adapter instanceof ExtraViewWrapAdapter) {
ExtraViewWrapAdapter wrapAdapter = (ExtraViewWrapAdapter) adapter;
wrapAdapter.setLoadingStatus(isLoading);
if (isScrollToEnd) {
recyclerView.scrollToPosition(wrapAdapter.getItemCount() - 1);
}
}
}
}
public static final void setHeaderViewEnable(boolean isHeaderEnable, boolean isScrollToHeader, RecyclerView recycleView) {
if (recycleView == null) {
return;
} else {
RecyclerView.Adapter adapter = recycleView.getAdapter();
if (adapter != null && adapter instanceof ExtraViewWrapAdapter) {
ExtraViewWrapAdapter wrapAdapter = (ExtraViewWrapAdapter) adapter;
wrapAdapter.setHeaderViewEnable(isHeaderEnable);
if (isScrollToHeader) {
recycleView.scrollToPosition(0);
}
}
}
}
public static final void setFooterViewEnable(boolean isFooterEnable, boolean isScrollToFooter, RecyclerView recyclerView) {
if (recyclerView == null) {
return;
} else {
RecyclerView.Adapter adapter = recyclerView.getAdapter();
if (adapter != null && adapter instanceof ExtraViewWrapAdapter) {
ExtraViewWrapAdapter wrapAdapter = (ExtraViewWrapAdapter) adapter;
wrapAdapter.setFootViewEnable(isFooterEnable);
if (isScrollToFooter) {
recyclerView.scrollToPosition(wrapAdapter.getItemCount() - 1);
}
}
}
}
/**
* 默认创建多头部/尾部包装类的adapter,头部/尾部都可显示
*
* @param innerAdapter
*/
public ExtraViewWrapAdapter(@NonNull RecyclerView.Adapter innerAdapter) {
this(innerAdapter, true, true);
}
/**
* 创建多头部/尾部包装类的adapter,使用此adapter包装内部adapter时会改变内部adapter的某些操作,当不再需要时请使用{@link #unregisterInnerAdatperDataObserver()}还原内部adapter的操作
*
* @param innerAdapter 内部引用的adapter,不可为null
* @param isHeaderViewEnable 头部view是否可用
* @param isFootViewEnable 尾部view是否可用
*/
public ExtraViewWrapAdapter(@NonNull RecyclerView.Adapter innerAdapter, boolean isHeaderViewEnable, boolean isFootViewEnable) {
this.setInnerAdapter(innerAdapter);
mIsHeaderViewEnable = isHeaderViewEnable;
mIsFootViewEnable = isFootViewEnable;
mHeaderOption = new HeaderFooterViewCache();
mFooterOption = new HeaderFooterViewCache();
mInnerAdapter.registerAdapterDataObserver(mDataObserver);
}
/**
* 设置固定头部item渲染的接口回调
*
* @param decoration 固定头部接口,用于回调判断当前项是否为头部/是否需要显示及绘制固定头部
*/
public void setIStickHeaderItemDecoration(StickHeaderItemDecoration.IStickerHeaderDecoration decoration) {
mIStickHeaderDecoration = decoration;
}
/**
* 设置 gridLayoutManager 需要显示的spanSizeLookup
*
* @param spanSizeLookup 用于正确显示item占用的网格数
*/
public void setISpanSizeLookup(HeaderSpanSizeLookup.ISpanSizeHandler spanSizeLookup) {
mISpanSizeLookup = spanSizeLookup;
}
/**
* 设置内置的innerAdapter,不可为null
*
* @param innerAdapter recycleView.Adapter,若该adapter已经实现了 {@link StickHeaderItemDecoration.IStickerHeaderDecoration}或者是{@link com.taro.headerrecycle.layoutmanager.HeaderSpanSizeLookup.ISpanSizeHandler}
* 将直接引用此实例,不需要再重新设置一次两个接口
*/
public void setInnerAdapter(@NonNull RecyclerView.Adapter innerAdapter) {
mInnerAdapter = innerAdapter;
if (mInnerAdapter != null && mInnerAdapter instanceof StickHeaderItemDecoration.IStickerHeaderDecoration) {
mIStickHeaderDecoration = (StickHeaderItemDecoration.IStickerHeaderDecoration) mInnerAdapter;
}
if (mInnerAdapter != null && mInnerAdapter instanceof HeaderSpanSizeLookup.ISpanSizeHandler) {
mISpanSizeLookup = (HeaderSpanSizeLookup.ISpanSizeHandler) mInnerAdapter;
}
}
/**
* 反注册内部innerAdapter的数据更新observer
*/
public void unregisterInnerAdatperDataObserver() {
if (mInnerAdapter != null) {
mInnerAdapter.unregisterAdapterDataObserver(mDataObserver);
}
}
/**
* 重新注册内部innerAdapter的数据更新observer
*/
public void reregisterInnerAdapterDataObserver() {
if (mInnerAdapter != null) {
mInnerAdapter.registerAdapterDataObserver(mDataObserver);
}
}
/**
* 获取当前WrapAdapter位置在InnerAdapter中对应的位置,即除去headerView及refreshView
*
* @param wrapAdapterPosition 当前WrapAdapter的位置
* @return
*/
public int getInnerAdapterPosition(int wrapAdapterPosition) {
int refreshViewCount = getRefreshingViewCount();
int headerViewCount = getHeaderViewCount();
return wrapAdapterPosition - refreshViewCount - headerViewCount;
}
/**
* 设置刷新头部view
*
* @param refreshingView
*/
public void setRefreshingHeaderView(View refreshingView) {
mRefreshHeader = refreshingView;
}
/**
* 设置加载尾部v
没有合适的资源?快使用搜索试试~ 我知道了~
HeaderRecycleAdapter/StickHeaderItemDecoration,头部加载Adapter及固定头部装...
共13个文件
java:10个
ds_store:3个
5星 · 超过95%的资源 需积分: 0 117 下载量 65 浏览量
2016-06-22
17:27:01
上传
评论
收藏 31KB ZIP 举报
温馨提示
1.HeaderRecycleAdapter,自动加载并显示列表头部,不需要自己判断数据源位置返回头部位置及信息. 2.StickHeaderItemDecoration,固定头部装饰类,实现其对应接口的所有Adapter都可以直接使用,或者直接使用HeaderRecycleAdapter(已经实现其接口) 3.相关内容可参考对应的博客.
资源推荐
资源详情
资源评论
收起资源包目录
headerrecycle.zip (13个子文件)
headerrecycle
.DS_Store 6KB
adapter
SimpleRecycleAdapter.java 3KB
ExtraViewWrapAdapter.java 23KB
HeaderRecycleAdapter.java 16KB
HeaderRecycleViewHolder.java 10KB
stickerheader
ErrorHeaderItemDecoration.java 5KB
StickHeaderItemDecoration.java 22KB
.DS_Store 6KB
helper
.DS_Store 6KB
RecycleVIewScrollHelper.java 15KB
RecycleViewOnClickHelper.java 6KB
layoutmanager
HeaderSpanSizeLookup.java 3KB
HeaderGridLayoutManager.java 2KB
共 13 条
- 1
资源评论
- YuuRo2017-07-17学习了,谢谢分享!
疯狂小芋头
- 粉丝: 20
- 资源: 2
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- C++builder5.0高级开发技巧与范例(配套光盘源码)
- 承诺书1111111111111111111
- 2024年新的全的2024年新的全的《建设工程造价鉴定规范》GBT51262-2017
- SimHei字体包(支持中文,正负号等)
- 基于Django+MySQL实现的校园智能点餐系统源码+数据库(高分项目)
- 基于Django实现校园智能点餐系统源码+数据库(高分期末大作业)
- 知识付费pc付费模板系统知识付费付费模板
- ARM Developer Guide
- Lazarus IDE 3.3-Free Pascal Windows版本
- 20190312-180244-旋转磁体产生的场造成激光功率减小
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功