Android RecyclerView多个Item布局的实现(可实现头部底部)
来源:互联网 发布:万能的淘宝 编辑:程序博客网 时间:2024/05/16 07:58
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); } }}
这是效果图
0 0
- Android RecyclerView多个Item布局的实现(可实现头部底部)
- Android RecyclerView多个Item布局的实现(可实现头部底部)
- RecyclerView 选择多个item的实现
- Android如何实现RecyclerView的item的展开及显示并让item位于头部
- RecyclerView实现添加头部和底部
- RecyclerView实现多种item布局
- RecyclerView的实现item中下划线的长度最后一行长度全长,其余长度较短的实现(可扩展),新增多布局隐藏部分下划线实现
- RecyclerView实现带有头部的顶部悬浮置顶布局
- 封装RecyclerView Adapter 实现可添加多个header和footer,可设置loadingView,低耦合的多种布局。
- RecyclerView多种item类型头部底部
- Android学习笔记之RecyclerView(二)-异布局Item实现
- RecyclerView多个item布局的写法(头布局+脚布局)
- Android recyclerview 多个布局 item数据错乱
- RecyclerView加载多类型item 实现淘宝首页布局
- Kotlin实战(二): 实现RecyclerView多种Item布局
- RecyclerView添加多个样式不同的Item布局
- RecyclerView添加多个样式不同的Item布局
- RecyclerView 添加头部和尾部,并实现Item的点击事件
- 页面生成表格方式总结
- 重载QwtPlot类编译错误,需宏定义QWT_DLL才能使用QWT抛出类
- Python datetime
- SIP消息路由
- 关于protected成员
- Android RecyclerView多个Item布局的实现(可实现头部底部)
- sourceTree创建分支和合并代码
- qqlite 插件开发总结
- php环境设置(win7)
- NLTK-自然语言工具包
- Android App 启动页(Splash)黑/白闪屏现象产生原因与解决办法
- LeetCode:Maximal Rectangle
- 【leetcode】155. Min Stack【E】【98】
- Not a host:port pair: PBUF(用Java客户端(Eclipse平台)连接Hbase)&&apache官网Jar下载流程