Recyclerview添加头布局和尾布局、item点击事件详解

简介:

本篇博客主要包括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);
 }
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android RecyclerView添加头部和底部的方法

    如果只是想添加头部,可是使用GitHub里面这个项目,它可以为LinearLayoutManager,GridLayoutManager ,StaggeredGridLayoutManager布局的RecyclerView添加header.使用起来也十分简单: 只需将RecyclerViewHeader布局放在RecyclerView的上层. <FrameLayout android:layout_width="match_parent" android:layout_heigh

  • Android中封装RecyclerView实现添加头部和底部示例代码

    前言 我们大家都知道ListView具有添加头部和添加底部的方法,但是RecyclerView并没有这样子的方法.所以RecyclerView是不能添加底部和头部的,但是能不能仿造ListView来实现RecyclerView添加头部和底部呢?答案当然是可行的.本文就来给大家介绍了关于Android封装RecyclerView添加头部和底部的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 首先看下实现的效果: 代码如下: public class WrapMyRecy

  • Android RecyclerView添加头部和底部实例详解

    Android RecyclerView添加头部和底部实例详解 如果只是想添加头部,可是使用GitHub里面这个项目,它可以为LinearLayoutManager,GridLayoutManager ,StaggeredGridLayoutManager布局的RecyclerView添加header.使用起来也十分简单: 只需将RecyclerViewHeader布局放在RecyclerView的上层. <FrameLayout android:layout_width="match_p

  • Android 中RecyclerView多种item布局的写法(头布局+脚布局)

    RecyclerView多个item布局的写法(头布局+脚布局) 上图 github 下载源码 Initial commit第一次提交的代码,为本文内容 以下的为主要代码,看注释即可,比较简单 MainActivity 含上拉加载更多 package com.anew.recyclerviewall; import android.os.Bundle; import android.os.Handler; import android.support.v7.app.AppCompatActivi

  • Recyclerview添加头布局和尾布局、item点击事件详解

    简介: 本篇博客主要包括recyclerview添加多种布局以及添加头布局和尾布局,还有item点击事件 思路: 主要重写Recyclerview.Adapter中的一些方法 1.public int getItemCount()  item熟练  +2(头布局和尾布局) 2.public int getItemViewType(int position)   判断position 设置itemType 3.创建不同的ViewHolder,分别用来加载头布局,正常布局,尾布局 4.public

  • Android RecyclerView的Item点击事件实现整理

    自从开始使用RecyclerView代替ListView,会发现有很多地方需要学习.前一段时间的学习记录有: RecyclerView的滚动事件研究 - DevWiki RecyclerView的ViewHolder和Adapter的封装优化 - DevWiki RecyclerView问题记录 - DevWiki 实现 RecyclerView的Item的点击事件有三种方式: 在创建 ItemView时添加点击监听 当 ItemView attach RecyclerView时实现 通过Rec

  • Android  RecyclerView的Item点击事件实现整理

    自从开始使用RecyclerView代替ListView,会发现有很多地方需要学习.前一段时间的学习记录有: RecyclerView的滚动事件研究 - DevWiki RecyclerView的ViewHolder和Adapter的封装优化 - DevWiki RecyclerView问题记录 - DevWiki 实现 RecyclerView的Item的点击事件有三种方式: 在创建 ItemView时添加点击监听 当 ItemView attach RecyclerView时实现 通过Rec

  • 使用jquery-easyui的布局layout写后台管理页面的代码详解

    先在官网下载easyui文档 引入头部文件 <link rel="stylesheet" type="text/css" href="${pageContext.request.contextPath}/static/jquery-easyui-1.3.3/themes/default/easyui.css" rel="external nofollow" rel="external nofollow"

  • Python:Scrapy框架中Item Pipeline组件使用详解

    Item Pipeline简介 Item管道的主要责任是负责处理有蜘蛛从网页中抽取的Item,他的主要任务是清晰.验证和存储数据. 当页面被蜘蛛解析后,将被发送到Item管道,并经过几个特定的次序处理数据. 每个Item管道的组件都是有一个简单的方法组成的Python类. 他们获取了Item并执行他们的方法,同时他们还需要确定的是是否需要在Item管道中继续执行下一步或是直接丢弃掉不处理. Item管道通常执行的过程有 清理HTML数据 验证解析到的数据(检查Item是否包含必要的字段) 检查是

  • jquery html动态添加的元素绑定事件详解

    在实际开发中会遇到要给动态生成的html元素绑定触发事件的情况: <div id="testdiv"> <ul></ul> </div> 假设我们要给ul动态添加的<li>绑定click事件形成如下结果 <div id="testdiv"> <ul> <li name="apple">apple</li> <li name="

  • Java 添加、删除、格式化Word中的图片步骤详解( 基于Spire.Cloud.SDK for Java )

    本文介绍使用Spire.Cloud.SDK for Java提供的ImagesApi接口来操作Word中的图片.具体可通过addImage()方法添加图片.deleteImage()方法删除图片.updateImageFormat()格式化Word中的图片以及getImageFormat()获取Word中的图片格式等.操作方法和代码示例可参考下文中的步骤. 步骤1:导入jar文件 创建Maven项目程序,通过maven仓库下载导入.以IDEA为例,新建Maven项目,在pom.xml文件中配置m

  • Android 中ListView的Item点击事件失效的快速解决方法

    在平常的开发过程中,我们的ListView可能不只是简单的显示下文本或者按钮,更多的是显示复杂的布局,这样的话,我们就得自己写布局和自定义adapter了,一般是继承于BaseAdapter,示例代码见下方.写ListView的点击事件时OnItemClickListener,onItemClick方法没有执行,导致ListView中Item条目点击事件失效,而Item中的View点击事件可以在getView方法中进行处理.导致整个Item点击失效的原因多半是由于在[你自己定义的Item中存在诸

  • Android中RecyclerView的item宽高问题详解

    前言 本文主要给大家介绍了关于Android中RecyclerView的item宽高问题的相关内容,分享出来供大家参考学习,下面话不多说了,来一起看看详细的介绍吧. 在创建viewholder传入的View时,如果不指定其viewgroup,就会出现宽高只包裹显示内容的问题. View view = LayoutInflater.from(context).inflate(R.layout.test_test,null); 上面的做法就会出问题 改成这样就可以正常显示设置的宽高 View vie

  • Android常用布局(FrameLayout、LinearLayout、RelativeLayout)详解

    很多开发者一听说Android终端的屏幕尺寸五花八门,屏幕分辨率千奇百怪,就觉得Android开发在屏幕适配方面是必定是一件头疼的事情.因为在Android问世之前,广大开发者知道的UI解决方案大致分为两类: 1.在Web开发中的CSS,一层一层的去层叠样式. 2.在iOS开发中去计算每一个UIView的尺寸. 上面两种方案,无论哪种方案面对碎片化严重的Android终端,那都是一场噩梦.好在Android提供了另一套解决方案来应对严重的终端碎片化,这就是布局和9-patch. 这里想来说说布局

随机推荐