Android RecyclerView多个Item布局的实现(可实现头部底部)
2015-10-10 11:57
951 查看
废话不多说,小猿,上代码
这里我把Adapter重新封装了一遍,实现了上中下三个部分的ViewHolder的创建和数据绑定,基本语法和原来普通的RecyclerView的Adapter一样,下面是demo代码,代码很简单,就不解释了,item里面就放了一个TextView
这是效果图
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(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; 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<HeadViewHolder,FootViewHolder,ItemViewHolder>() { @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实战-初探EventBus
- Android实现完整游戏循环的方法
- 一篇简绍android SQLite基础的好文章
- android中ip和hosts地址的获取
- android ndk 提高编译数度(cpu 多核编译)
- 怎么找android应用的包名和启动activity
- Android测量每秒帧数Frames Per Second (FPS)的方法
- android——Snackbar+CoordinatorLayout替代Toast
- Android内存优化之OOM全解
- android中如何实现离线缓存
- android开发教程之清除android数据缓存示例(清除本地数据缓存)
- android中gridView中点击 item为选中状态
- Android开发最佳实践
- 安卓倒计时(android.os.Handler.Handler()
- TextView加下划线
- Android之Fragment案例解析
- Android学习文档之获取内存大小
- android开发知识块总结
- android实现无滚轮(ScrollView)的listview 和gridview
- android ndk Android.mk