简介:

  本篇博客主要包括recyclerview添加多种布局以及添加头布局和尾布局,还有item点击事件

思路:

  主要重写Recyclerview.Adapter中的一些方法

  1.public int getItemCount()  item熟练  +2(头布局和尾布局)

  2.public int getItemViewType(int position)   判断position 设置itemType

  3.创建不同的ViewHolder,分别用来加载头布局,正常布局,尾布局

  4.public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType)  根据viewType的不同返回不同的viewholder

  5.public void onBindViewHolder(RecyclerView.ViewHolder holder, int position)  根据holder的不同绑定不同的数据

案例:

  主布局中只有一个Recyclerview,里面的item除了基本的两种类型,还有头布局和尾布局,点击基本类型跳转到另外一个Activity,显示图片

  

  下面主要贴出Adapter和MainActivity中的代码,其他的布局文件,类比较简单就不贴出了

  1.Adapter

  

public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {
private Context context;
private List<Person> datas; private static final int ITEM_ONE=1;
private static final int ITEM_TWO=2;
private static final int ITEM_HEAD=3;
private static final int ITEM_FOOT=4; private int headViewCount=1;
private int footViewCount=1; private OnItemClickListener onItemClickListener; public MyAdapter(Context context, List<Person> datas) {
this.context = context;
this.datas = datas;
} @Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType==ITEM_HEAD){
View view= LayoutInflater.from(context).inflate(R.layout.item_head,parent,false);
return new HeaderViewHolder(view);
}else if(viewType==ITEM_FOOT){
View view=LayoutInflater.from(context).inflate(R.layout.item_foot,parent,false);
return new FootViewHolder(view);
} else if(viewType==ITEM_ONE){
View view= LayoutInflater.from(context).inflate(R.layout.item_recyclerview,parent,false);
return new ViewHolder(view);
}else if(viewType==ITEM_TWO){
View view=LayoutInflater.from(context).inflate(R.layout.item_recyclerview2,parent,false);
return new ViewHolder(view);
} return null; } @Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
if(holder instanceof HeaderViewHolder){ }else if(holder instanceof FootViewHolder){ } else if(holder instanceof ViewHolder){
//注意除去头布局
holder.itemView.setTag(position-1);
holder.itemView.setOnClickListener(this);
((ViewHolder)holder).img.setBackgroundResource(datas.get(position-1).getImgId());
((ViewHolder)holder).tv1.setText(datas.get(position-1).getName());
((ViewHolder)holder).tv2.setText(datas.get(position-1).getDetail());
}
} @Override
public int getItemCount() {
if(datas==null){
return headViewCount+footViewCount;
}
return datas.size()+headViewCount+footViewCount;
} @Override
public int getItemViewType(int position) {
if(isHeadView(position)){
return ITEM_HEAD;
}
if(isFootView(position)){
return ITEM_FOOT;
} if(position%2==0){
return ITEM_ONE;
}else{
return ITEM_TWO;
}
} public boolean isHeadView(int position){ return headViewCount!=0&&position<headViewCount;
}
public boolean isFootView(int position){
return footViewCount!=0&&position>=(datas.size()+headViewCount);
} @Override
public void onClick(View view) {
if(onItemClickListener!=null){
onItemClickListener.onItemClick(view, (Integer) view.getTag());
}
} class ViewHolder extends RecyclerView.ViewHolder{
TextView tv1,tv2;
ImageView img; public ViewHolder(View itemView) {
super(itemView);
tv1=itemView.findViewById(R.id.tv1);
tv2=itemView.findViewById(R.id.tv2);
img=itemView.findViewById(R.id.img);
}
}
class HeaderViewHolder extends RecyclerView.ViewHolder{ public HeaderViewHolder(View itemView) {
super(itemView);
}
}
class FootViewHolder extends RecyclerView.ViewHolder{ public FootViewHolder(View itemView) {
super(itemView);
}
} public void setOnItemClickListener(OnItemClickListener onItemClickListener){
this.onItemClickListener=onItemClickListener;
} interface OnItemClickListener{
void onItemClick(View view,int position);
}
}

    

  2.MainActivity

  
public class MainActivity extends AppCompatActivity implements MyAdapter.OnItemClickListener {
private RecyclerView recyclerView; private List<Person> datas;
private MyAdapter adapter; private int[] imgs={R.drawable.p1,R.drawable.p2,R.drawable.p3,R.drawable.p4,R.drawable.p5,R.drawable.pic1,
R.drawable.pic2,R.drawable.pic3,R.drawable.pic4,R.drawable.pic5,R.drawable.pic6}; @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView= (RecyclerView) findViewById(R.id.recyclerview);
initData();
initRecyclerView();
} private void initRecyclerView() {
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter=new MyAdapter(this,datas);
adapter.setOnItemClickListener(this);
recyclerView.setAdapter(adapter); } private void initData() {
datas=new ArrayList<>();
for(int i=0;i<imgs.length;i++){
Person p=new Person();
p.setName("hahfa"+i);
p.setDetail("今天是星期一,还有5天才能休息"+i);
p.setImgId(imgs[i]);
datas.add(p);
}
} @Override
public void onItemClick(View view, int position) {
Intent intent=new Intent(MainActivity.this,ImageActivity.class);
intent.putExtra("imgId",datas.get(position).getImgId());
startActivity(intent);
}
}


												

Recyclerview添加头布局和尾布局,点击效果的更多相关文章

  1. 手把手教你给RecycleView添加头布局和尾布局

    RecycleView想必大家都不陌生,它已他的高拓展性取代了传统布局显示,同时配合协调布局,可以实现很多意想不到的酷炫交互,今天就和大家介绍一下,如何给RecycleView添加头布局和尾布局,同时 ...

  2. 仿喜马拉雅实现ListView添加头布局和脚布局

     ListView添加头布局和脚布局 之前学习喜马拉雅的时候做的一个小Demo,贴出来,供大家学习参考: 如果我们当前的页面有多个接口.多种布局的话,我们一般的选择无非就是1.多布局:2.各种复杂滑动 ...

  3. GridView不能添加头布局,并且scrollView与GridView冲突导致一些页面无法融合

    此贴为标记贴 方便下次使用 在项目需求中原本是用ScrollView来进行整个页面的滑动,ScrollView里面包含的有图片轮播,文字轮播,与2列GridView的item 问题 使用原生的Grid ...

  4. Android 5.X新特性之为RecyclerView添加下拉刷新和上拉加载及SwipeRefreshLayout实现原理

    RecyclerView已经写过两篇文章了,分别是Android 5.X新特性之RecyclerView基本解析及无限复用 和 Android 5.X新特性之为RecyclerView添加Header ...

  5. Android 5.X新特性之为RecyclerView添加HeaderView和FooterView

    上一节我们讲到了 Android 5.X新特性之RecyclerView基本解析及无限复用 相信大家也应该熟悉了RecyclerView的基本使用,这一节我们来学习下,为RecyclerView添加H ...

  6. RecyclerView添加Header的正确方式

    原文链接:http://blog.csdn.net/qibin0506/article/details/49716795 看了一下博客目录,已经有好几篇博客是关于RecyclerView的,不过对于这 ...

  7. Android RecyclerView添加Header头部

     Android RecyclerView添加Header头部 Android RecyclerView不像以前的ListView那样直接添加头部,如果要给RecyclerView增加头部,则需要 ...

  8. 为ListView添加头和脚

      转自:https://software.intel.com/zh-cn/blogs/2014/12/15/android-listview-addheaderview-addfooterview ...

  9. 中间自适应,左右定宽的两种经典布局 ---- 圣杯布局 VS 双飞翼布局

    一.引子 最近学了些js框架,小有充实感,又深知如此节奏的前提需得基础扎实,于是回头想将原生CSS和Javascript回顾总结一番,先从CSS起,能集中它的就在基础的布局上,便查阅了相关资料,将布局 ...

随机推荐

  1. cxGrid使用汇总3

    32根据单元的值设置样式   解决:procedure   <aForm>.<aColumn>StylesGetContentStyle(         Sender:   ...

  2. TCP之四:TCP 滑动窗口协议 详解

    滑动窗口机制 滑动窗口协议的基本原理就是在任意时刻,发送方都维持了一个连续的允许发送的帧的序号,称为发送窗口:同时,接收方也维持了一个连续的允许接收的帧的序号,称为接收窗口.发送窗口和接收窗口的序号的 ...

  3. mysql核心参数优化

    MySQL数据库服务器配置CPU的优化内存的优化IO的优化连接的优化数据一致性的优化 1.描述back_log参数的作用? back_log = 500 要求 MySQL 能有的连接数量.当主要MyS ...

  4. GNS3连接虚拟机

      打开GNS3,拖一台路由器和主机   右击主机,选择配置   添加虚拟机的网卡为主机网卡,(选择VM1或VM8)   路由器选择虚拟机网卡连接   打开虚拟机在导航栏找到“虚拟机”-->“设 ...

  5. Android 4学习(9):用户界面 - THE ANDROID WIDGET TOOLBOX

    Android内置了很多View,包括: TextView EditText Chronometer ListView Spinner Button ToggleButton ImageButton ...

  6. ARM六种寻址方式的汇编实现

    AREA Example,CODE,READONLY ENTRY CODE32 ;S 后缀:更新标志位CPSR ;!后缀:基址寄存器中的地址发生变化 ;LDR 从存储器中加载数据到寄存器 ;STR 从 ...

  7. sql server生成递归日期、连续数据

    WITH Date AS ( SELECT CAST('2008-08-01' AS DATETIME) da UNION ALL FROM Date WHERE da < '2008-08-2 ...

  8. Timer的定义及demo

  9. 基于C++11的线程池(threadpool),简洁且可以带任意多的参数

    咳咳.C++11 加入了线程库,从此告别了标准库不支持并发的历史.然而 c++ 对于多线程的支持还是比较低级,稍微高级一点的用法都需要自己去实现,譬如线程池.信号量等.线程池(thread pool) ...

  10. Postman之token动态获取

    目前项目涉及PC及APP端接口共用问题,后台接口给登陆后的用户设置了一个token,接口调用时请求头的参数值必须要动态生成,为了解决这个问题,查看Postman API文档,配置了可以方便后端开发者的 ...