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

疯狂小芋头
- 粉丝: 20
- 资源: 1
最新资源
- 基于Matlab开发的整车动力系统匹配计算软件:一键匹配输出性能要求,底层代码同时公开,基于Matlab开发的整车动力系统匹配计算软件:自动化匹配输出与底层代码同步输出,动力系统匹配软件 本程序是基于
- 基于自回归滑动平均模型(ARMA)的时间序列预测方法:如何设置AR、MA阶数及使用Matlab代码实现,基于自回归滑动平均模型的时间序列预测算法及Matlab代码实现,ARMA阶数自定义设定 使用20
- 串口转以太网通信:多路转换、双向通信、UDP与TCP客户端支持、Qt环境源代码及设计文档,串口转以太网双向通信源代码解析及功能指南-C/C++开发支持UDP和TCP连接及多路转换技术,串口转以太网通
- 基于PLC的物料自动称量控制系统:程序组态与混合配料解决方案,《基于PLC技术的物料自动称量控制系统及其程序组态解析》,基于PLC的物料自动称量控制系统称重配料物料混合程序组态 我们主要的后发送的
- STM32F407串口服务器DEMO:基于lwIP和FreeRTOS的网络通信功能实现,附独家电路原理图与PCB图,STM32F407串口服务器DEMO:以太网通信协议、动态IP配置与多种网络功能实现
- 机器人轨迹规划技术:三次多项式与五次多项式轨迹规划的对比研究及六自由度应用,机器人轨迹规划技术:三次多项式与五次多项式轨迹规划的对比研究及六自由度应用,机器人轨迹规划 353轨迹规划三次多项式轨迹规划
- 基于全新技术资料的全套控制器,全新定制电池保护功能的900W 至 1KW 高效率充电机控制器套装,量产版1KW充电机控制器全套资料,含PCB、程序、BOM等,高效率双管正激可调,全面保护机制与RS23
- 基于C++开发的超级终端控制台命令行Serial串口调试工具:交互式输入,配置保存,编辑快捷发送,支持复制粘贴与定制功能,基于C++的超级终端控制台Serial串口调试工具:交互式输入,配置保存,编辑
- Qt QCustomPlot实现多功能数据折线图绘制,精美界面与丰富交互体验,Qt QCustomPlot实现多功能数据折线图绘制,精美界面与丰富交互体验,Qt源程序~使用QCustomPlot进行数
- 利用希尔伯特变换:独立实现的信号瞬时相位、瞬时频率、瞬时幅值提取Demo,希尔伯特变换在信号处理中的应用:完全自主实现瞬时相位、瞬时频率、瞬时幅值提取的Demo,通过希尔伯特变求取信号的瞬时相位、瞬时
- LabView源码与三菱FX编程口协议通讯实现指南,LabView源码与三菱FX编程口协议通讯实现指南,labview源码,和三菱FX编程口协议通讯 ,Labview源码; 三菱FX编程口协议通讯,L
- Qt步进电机上位机程序:跨平台C++控制源码,支持串口、TCP/UDP网络,注释详尽,配置自动保存,超时提醒,源码包含设计文档,Qt步进电机上位机程序:跨平台C++控制源码,支持串口、TCP/UDP网
- 基于Matlab的LED计数程序-自定义GUI界面及姓名学号管理系统,基于Matlab的LED计数程序:可自定义姓名学号的GUI界面完整程序,基于matlab的Led计数程序 1、可运行完整程序 2
- 单相逆变器S函数仿真:基于S函数控制算法的模型运行与高精度输出电压品质,单相逆变器S函数仿真:基于S函数控制算法的模型运行与高精度输出电压品质优化,单相逆变器S函数仿真,控制算法采用 S函数编写,在模
- 带PID控制功能的恒压供水系统仿真运行程序-组态王6.53版,结合视频展示全面功能与效果,带PID控制功能的恒压供水系统仿真运行程序(组态王6.53版)- 视频演示版,带PID控制功能的恒压供水组态
- 昆仑通态恒压供水组态程序:三菱FX系列PLC驱动,稳定可靠运行,简洁美观用户界面,昆仑通态恒压供水PLC组态程序:三菱FX系列,可靠运行,简洁美观界面,昆仑通态恒压供水组态程序,使用三菱FX系列PLC
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈


