废话不多说,小猿,上代码

package git.dzc.library;import android.support.v7.widget.RecyclerView;import android.view.ViewGroup;/** * Created by dzc on 15/10/9. */public abstract class HeadFootAdapter<HeadViewHolder extends RecyclerView.ViewHolder,FootViewHolder extends RecyclerView.ViewHolder,ItemViewHolder extends RecyclerView.ViewHolder> extends RecyclerView.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){            case 0:                return onCreateHeaderViewHolder(viewGroup,viewType);            case 1:                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){          case 0:              onBindHeaderViewHolder((HeadViewHolder) viewHolder,i);              break;          case 1:              onBindItemViewHolder((ItemViewHolder) viewHolder,i-headCount);              break;          case 2:              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(positionreturn 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;public class MainActivity extends AppCompatActivity {    private RecyclerView rv;    @Override    protected void onCreate(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() {            @Override            public HeadViewHolder onCreateHeaderViewHolder(ViewGroup parent, int position) {                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item2,parent,false);                return new HeadViewHolder(view);            }            @Override            public ItemViewHolder onCreateItemViewHolder(ViewGroup parent, int position) {                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item,parent,false);                return new ItemViewHolder(view);            }            @Override            public FootViewHolder onCreateFooterViewHolder(ViewGroup parent, int position) {                View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.item2,parent,false);                return new FootViewHolder(view);            }            @Override            public void onBindHeaderViewHolder(HeadViewHolder holder, int position) {                holder.tv.setTextColor(Color.GREEN);                holder.tv.setTextSize(30);                holder.tv.setText("head "+position);            }            @Override            public void onBindItemViewHolder(ItemViewHolder holder, int position) {                holder.tv.setText("item  "+position);            }            @Override            public void onBindFooterViewHolder(FootViewHolder holder, int position) {                holder.tv.setTextColor(Color.BLUE);                holder.tv.setTextSize(34);                holder.tv.setText("foot "+position);            }            @Override            public int getItemViewCount() {                return 10;            }            @Override            public int getHeadViewCount() {                return 7;            }            @Override            public int getFootViewCount() {                return 8;            }        });    }    class ItemViewHolder extends RecyclerView.ViewHolder{        public TextView tv;        public ItemViewHolder(View itemView) {            super(itemView);            tv = (TextView) itemView.findViewById(R.id.tv);        }    }    class HeadViewHolder extends RecyclerView.ViewHolder{        public TextView tv;        public HeadViewHolder(View itemView) {            super(itemView);            tv = (TextView) itemView.findViewById(R.id.tv);        }    }    class FootViewHolder extends RecyclerView.ViewHolder{        public TextView tv;        public FootViewHolder(View itemView) {            super(itemView);            tv = (TextView) itemView.findViewById(R.id.tv);        }    }}

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

更多相关文章

  1. Android应用程序启动过程源代码分析(3)
  2. Android应用程序启动过程源代码分析(2)
  3. android 不使用布局文件,完全由代码控制布局实例
  4. android源代码下载——android环境配置
  5. Android EditText 代码实现键盘弹出打开和关闭工具类
  6. Android SDK 实例代码分析---Accelerometer Play(二)
  7. 如何通过代码更改ANDROID的UI布局

随机推荐

  1. Android利用Fiddler进行网络数据抓包
  2. Android的Activity切换动画特效库SwitchL
  3. Android开发环境配置简介
  4. Android(安卓)IPC机制(三):浅谈Binder的
  5. Android编程内存溢出与防范方法浅析
  6. Mac OS X下用Eclipse浏览和编译Android源
  7. Android事件分发机制完全解析,带你从源码
  8. Android的开篇
  9. Android(安卓)架构大致分析
  10. Android嵌入式开发初学者的几个注意点