可以添加多个头视图、尾视图的RecycleView适配器

import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;

import java.util.ArrayList;

/**
 * 可以添加多个透视图、尾视图的适配器
 * Created by WangGang on 2015/5/27.
 */
public abstract class AdvancedAdapter2 extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    private static final String TAG = "=========";
    private ArrayList<View> mHeaderViews = new ArrayList<>(); //头视图
    private ArrayList<View> mFooterViews = new ArrayList<>();   //尾视图

    public void addHeaderView(View headerView) {
        mHeaderViews.add(headerView);
    }

    public void addFooterView(View footerView) {
        mFooterViews.add(footerView);
    }

    private ArrayList<Integer> mHeaderViewTypes = new ArrayList<>();
    private ArrayList<Integer> mFooterViewTypes = new ArrayList<>();

    @Override
    public int getItemViewType(int position) {

        if (mHeaderViews.size() > 0 && position < mHeaderViews.size()) {
            //用position作为HeaderView 的   ViewType标记
            //记录每个ViewType标记
            mHeaderViewTypes.add(position * 100000);
            return position * 100000;
        }

        if (mFooterViews.size() > 0 && position > getAdvanceCount() - 1 + mHeaderViews.size()) {
            //用position作为FooterView 的   ViewType标记
            //记录每个ViewType标记
            mFooterViewTypes.add(position * 100000);
            return position * 100000;
        }

        if (mHeaderViews.size() > 0) {
            return getAdvanceViewType(position - mHeaderViews.size());
        }

        return getAdvanceViewType(position);
    }

    public abstract int getAdvanceViewType(int position);

    /**
     * !! 不能为0!!!
     *
     * @return
     */
    protected abstract int getAdvanceCount();

    protected abstract void onBindAdvanceViewHolder(RecyclerView.ViewHolder holder, int i);

    protected abstract RecyclerView.ViewHolder onCreateAdvanceViewHolder(ViewGroup parent, int viewType);

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        if (mHeaderViewTypes.contains(viewType)) {
            return new HeaderHolder(mHeaderViews.get(viewType / 100000));
        }

        if (mFooterViewTypes.contains(viewType)) {
            int index = viewType / 100000 - getAdvanceCount() - mHeaderViews.size();
            return new FooterHolder(mFooterViews.get(index));
        }

        return onCreateAdvanceViewHolder(parent, viewType);
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

        if (mFooterViews.size() > 0 && (position > getAdvanceCount() - 1 + mHeaderViews.size())) {
            return;
        }

        if (mHeaderViews.size() > 0) {
            if (position < mHeaderViews.size()) {
                return;
            }
            onBindAdvanceViewHolder(holder, position - mHeaderViews.size());
            return;
        }
        onBindAdvanceViewHolder(holder, position);
    }

    class HeaderHolder extends RecyclerView.ViewHolder {

        public HeaderHolder(View itemView) {
            super(itemView);
        }
    }

    class FooterHolder extends RecyclerView.ViewHolder {

        public FooterHolder(View itemView) {
            super(itemView);
        }
    }

    @Override
    public int getItemCount() {
        if (mHeaderViews.size() > 0 && mFooterViews.size() > 0) {
            return getAdvanceCount() + mHeaderViews.size() + mFooterViews.size();
        }
        if (mHeaderViews.size() > 0) {
            return getAdvanceCount() + mHeaderViews.size();
        }
        if (mFooterViews.size() > 0) {
            return getAdvanceCount() + mFooterViews.size();
        }

        return getAdvanceCount();
    }

}

时间: 2024-08-02 12:54:07

可以添加多个头视图、尾视图的RecycleView适配器的相关文章

在UIWebView 上面添加一个头视图 让它能随webView 滚动

UIWebView是iOS sdk中一个最常用的控件.它是一个内置的浏览器控件,我们可以用它来浏览网页.打开文档等等. UIWebView可以用来向用户展示一些网页信息,在我们进行开发的时候,通常会想在这个Controller上面添加一个headerView用来展示标题或者图片 ,那么我们此时就会遇到一个问题,就是怎么在一个webView上面添加头视图. 我在网上搜过这个问题,很多人说直接在webView的scrollView上添加一个View.这样确实可以实现在webView上添加头视图,但是

低版本系统兼容的ActionBar(四)添加Tab+添加自定义的Tab视图

在ActionBar中添加Tab是很有用的技巧.在support V7库的支持下,我们几乎可以用和之前一样的方式来添加Tab,对于Tab来说,我们可以和MenuItem一样,给他定义自己的视图.我这里定义了个进度条,主要是来说明这个问题.本系列的博文也将接近尾声了,后面就是个定义ActionBar样式和一个仿照微信的实例,顺便讲解下Fragment和ViewPager的用法. activity_main.xml(定义了一个Fragment) <RelativeLayout xmlns:andro

iOS 视图与视图层次结构(内容根据iOS编程)

视图基础 视图是 UIView 对象,或者其子对象. 视图知道如何绘制自己. 视图可以处理事件,例如触摸(touch). 视图会按照层次结构排列,位于视图层次结构顶端的是应用窗口. 视图层次结构 任何应用有且只有一个  UIWindow 对象. UIWindow 对象就像是一个容器,负责包含应用中的所有的视图.应用需要在启动时创建并设置 UIWindow 对象,然后为其添加其他视图. 加入窗口的视图会成为该窗口的子视图.窗口的子视图还可以有自己的子视图,从而构成一个以 UIWindow 对象为根

iOS-UI父视图下视图的操作

在窗口上创建三个视图: 橘色的v1 UIView *v1 = [[UIView alloc]initWithFrame:CGRectMake(100, 200, 200, 200)]; v1.backgroundColor = [UIColor orangeColor]; [self.window addSubview:v1]; 黑色的v2 UIView *v2 =[[UIView alloc]initWithFrame:CGRectMake(50, 300, 300, 300)]; v2.ba

UI-自定义视图、视图控制器

自定义视图 自定义视图:系统标准UI之外,自己组合而出的新的视图. iOS提供了很多UI组件,借助它们,我们可以做各种程序. 创建步骤 创建一个UIView子类 在类的初始化方法中添加子视图 类的.h文件提供一些接口(方法),便于外界操作子视图 视图控制器 UIViewController:视图控制器: 控制视图显示,响应事件: 分担AppDelegate的工作: 实现模块独立,提高复用性. 视图控制器功能 控制试图大小变换.布局视图.响应事件 检测以及处理内存警告 检测以及处理屏幕旋转 检测视

IOS开发之视图和视图控制器

视图(View), 视图控制器(ViewController)是IOS开发UI部分比较重要的东西.在学习视图这一块的东西的时候,感觉和Java Swing中的Panel差不多.在UIKit框架中都有一个UIWindow来容纳我们的View.应用程序中几乎全部的可视控件都是UIView以及UIView的子类的实例,并且UIWindow也是UIView的子类.UIWindow可以不借助于父类视图显示在屏幕上,其余的视图都需要添加到父视图中才能显示.窗口是用来显示视图的,下面我们将会结合着实例来具体的

Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation

Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation 通过上一小节的操作,我们新建了2个动画:PlayerIdleAnimation和PlayerWalkingAnimation.而且在单击Animation视图里的播放按钮时,也看到了动画的效果.但是现在还需要管理这两个动画,也就是说需要能够指定精灵当前进入的动画状态,为此就需要对动画控制器展开一些设置和操作,具体的步骤是本文选自Unity 2D游戏开发从入门到精通清华大

Mysql备份迁移——Mysqldump(.NET调用Mysqldump.exe方式)——(解决视图嵌视图报错)

利用Mysqldump备份和迁移,我想很多人都用过,具体参数不介绍了,这里主要讲.NET调用Mysqldump进行备份和.NET调用Mysql.exe进行导入数据. 这里使用的是5.1版的Mysqldump.exe和Mysql.exe(5.5版的用过,没测试成功) 因为要解决导入时视图嵌视图会报错的情况,所以本案分成两步操作. 第一步:只迁移表结构.视图.存储过程.函数.事件等.(为何这里数据不一起导呢,因为到视图需要加上--extended-insert=false,这样导数据会很慢,所以分成

Animator窗口视图Project视图PlayerIdleAnimation和PlayerWal

Animator窗口视图Project视图PlayerIdleAnimation和PlayerWalkingAnimation 通过上一小节的操作,我们新建了2个动画:PlayerIdleAnimation和PlayerWalkingAnimation.而且在单击Animation视图里的播放按钮时,也看到了动画的效果.但是现在还需要管理这两个动画,也就是说需要能够指定精灵当前进入的动画状态,为此就需要对动画控制器展开一些设置和操作,具体的步骤是本文选自Unity 2D游戏开发从入门到精通清华大