Android RecyclerView多个Item布局的实现(可实现头部底部)

package git.dzc.library;

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


/**
 * Created by dzc on 15/10/9.
 */
public abstractclassHeadFootAdapter<HeadViewHolderextendsRecyclerView.ViewHolder,FootViewHolderextendsRecyclerView.ViewHolder,ItemViewHolderextendsRecyclerView.ViewHolder> extendsRecyclerView.Adapter<RecyclerView.ViewHolder> {//item的type 代表头部 中间  底部三个类型
    static int TYPE_HEAD = 0;
    static int TYPE_ITEM = 1;
    static int TYPE_FOOT = 2;

    /**
    *头部ViewHolder
    **/
    public abstract HeadViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position);

    public abstract ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int position);

    public abstract FootViewHolder onCreateFooterViewHolder(ViewGroup parent, int position);

    public abstract void onBindHeaderViewHolder(HeadViewHolder holder, int position);

    public abstract void onBindItemViewHolder(ItemViewHolder holder, int position);

    public abstract void onBindFooterViewHolder(FootViewHolder holder, int position);

    /**
    *根据viewType来创建不同的ViewHolder
    **/@Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {
        switch (viewType){
            case0:
                return onCreateHeaderViewHolder(viewGroup,viewType);
            case1:
                return onCreateItemViewHolder(viewGroup, viewType);
            default:
                return onCreateFooterViewHolder(viewGroup,viewType);
        }
    }

    /**
    *根据ViewType绑定数据  这里重新计算了position,使每个部分的position都从0开始
    **/@Override
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int i) {


      int headCount = getHeadViewCount();
      int itemViewCount = getItemViewCount();
      int itemType = getItemViewType(i);
      switch (itemType){
          case0:
              onBindHeaderViewHolder((HeadViewHolder) viewHolder,i);
              break;
          case1:
              onBindItemViewHolder((ItemViewHolder) viewHolder,i-headCount);
              break;
          case2:
              onBindFooterViewHolder((FootViewHolder) viewHolder,i-itemViewCount-headCount);
              break;

        }
    }


    /**
    *adapter会调用这个方法来获取item的总数
    *因为在这里  总数为上中下三部分数量加起来  不需要重写 
    *所以标志为final
    *返回所有View的数量
    **/@Override
    public final int getItemCount(){
        return  getHeadViewCount() + getFootViewCount() + getItemViewCount();
    }

    /**
    *返回头部View的数量
    **/
    public abstract int getHeadViewCount();


    /**
    *返回底部View的数量
    **/
    public abstract int getFootViewCount();


    /**
    *返回中间View的数量
    **/
    public abstract int getItemViewCount();

    /**
    *这句话是关键  根据position来判断item的类型 
    *adapter会将此方法的返回值传入onCreateViewHolder
    **/@Override
    public int getItemViewType(int position) {
     //   return super.getItemViewType(position);
        int headCount = getHeadViewCount();
        int itemCount = getItemViewCount();

        if(position<headCount){
            return TYPE_HEAD;
        }
        if(position>headCount+itemCount-1){
            return TYPE_FOOT;
        }
        return TYPE_ITEM;

    }
}

这里我把Adapter重新封装了一遍,实现了上中下三个部分的ViewHolder的创建和数据绑定,基本语法和原来普通的RecyclerView的Adapter一样,下面是demo代码,代码很简单,就不解释了,item里面就放了一个TextView

package git.dzc.head_foot_recycleview;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import git.dzc.library.HeadFootAdapter;

publicclassMainActivityextendsAppCompatActivity {private RecyclerView rv;

    @OverrideprotectedvoidonCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.Activity_main);

        rv = (RecyclerView) findViewById(R.id.rv);
        rv.setLayoutManager(new LinearLayoutManager(MainActivity.this));
        rv.setAdapter(new HeadFootAdapter<HeadViewHolder,FootViewHolder,ItemViewHolder>() {
            @Overridepublic HeadViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position) {
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item2,parent,false);
                returnnew HeadViewHolder(view);
            }

            @Overridepublic ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int position) {
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);
                returnnew ItemViewHolder(view);
            }

            @Overridepublic FootViewHolder onCreateFooterViewHolder(ViewGroup parent, int position) {
                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item2,parent,false);
                returnnew FootViewHolder(view);
            }

            @OverridepublicvoidonBindHeaderViewHolder(HeadViewHolder holder, int position) {
                holder.tv.setTextColor(Color.GREEN);
                holder.tv.setTextSize(30);
                holder.tv.setText("head "+position);
            }

            @OverridepublicvoidonBindItemViewHolder(ItemViewHolder holder, int position) {
                holder.tv.setText("item  "+position);
            }

            @OverridepublicvoidonBindFooterViewHolder(FootViewHolder holder, int position) {
                holder.tv.setTextColor(Color.BLUE);
                holder.tv.setTextSize(34);
                holder.tv.setText("foot "+position);
            }

            @OverridepublicintgetItemViewCount() {
                return10;
            }

            @OverridepublicintgetHeadViewCount() {
                return7;
            }

            @OverridepublicintgetFootViewCount() {
                return8;
            }
        });
    }


    class ItemViewHolder extends RecyclerView.ViewHolder{
        public TextView tv;
        publicItemViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }
    }


    class HeadViewHolder extends RecyclerView.ViewHolder{
        public TextView tv;
        publicHeadViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }
    }

    class FootViewHolder extends RecyclerView.ViewHolder{
        public TextView tv;
        publicFootViewHolder(View itemView) {
            super(itemView);
            tv = (TextView) itemView.findViewById(R.id.tv);
        }
    }
}

这是效果图 
Android RecyclerView多个Item布局的实现(可实现头部底部)

').addClass('pre-numbering').hide(); $(this).addClass('has-numbering').parent().append($numbering); for (i = 1; i <= lines; i++) { $numbering.append($('
  • ').text(i)); }; $numbering.fadeIn(1700); }); });


评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值