全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

Android RecyclerView点击事件

一、概述

随着Android L版本的发布,RecyclerView已经逐渐地取代了ListView,用来显示较多的数据集,RecyclerView相比ListView在性能上有了大幅度的提升,可以说RecyclerView是AbsListView的升级版本。RecyclerView自带了ViewHolder使用,与ListView缓存convertView不同的是,RecyclerView缓存的是ViewHolder,操作对象也是ViewHolder。虽然ListView也带有缓存convertView的功能,但是当使用ListView时,显示、缓存、回收、布局等都是耦合在一起的;而RecyclerView对其进行了解耦,操作更灵活,使得开发者可以更好的自定义各种各样的效果,另外RecyclerView假如了局部刷新。关系如下图所示:

二、基本使用

RecyclerView提供了下面几种角色
1.RecyclerView.Adapter    适配器
2.RecyclerView.LayoutManager  布局器,用于管理布局显示,官方提供以下几种方式

LinearLayoutManager   显示垂直或水平滚动的列表项
GridLayoutManager      以网格方式显示
StaggeredGridLayoutManager   以交错网格显示

同时,开发者也可以自定义LayoutManager,继承RecyclerView.LayoutManager。

3.Recycler.ItemDecoration 每个item附加的子视图,可用来绘制Divider,设置padding等
4.RecyclerView.ItemAnimator 负责添加、删除数据时的动画效果

具体的使用方法见 官方文档

项目中使用

Activity中

protected void onCreate(Bundle savedInstanceState) { 
  super.onCreate(savedInstanceState); 
  setContentView(R.layout.activity_main); 
 
  initView(); 
 } 
 
 private void initView() { 
  recyclerView = (RecyclerView) findViewById(R.id.rv); 
  // use this setting to improve performance if you know that changes 
  // in content do not change the layout size of the RecyclerView 
  recyclerView.setHasFixedSize(true); 
  // use a linear layout manager 
  LinearLayoutManager ll = new LinearLayoutManager(this); 
  recyclerView.setLayoutManager(ll); 
  initializeData(); 
  recyclerAdapter = new RecyclerAdapter(persons); 
  recyclerView.setAdapter(recyclerAdapter); 
 
 } 
 
 
 private void initializeData(){ 
  persons = new ArrayList<>(); 
  persons.add(new Person("Emma Wilson", "23 years old", R.mipmap.ic_launcher)); 
  persons.add(new Person("Lavery Maiss", "25 years old", R.mipmap.ic_launcher)); 
  persons.add(new Person("Lillie Watts", "35 years old", R.mipmap.ic_launcher)); 
 } 

自定义Adapter

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder>{ 
 private List<Person> list; 
 
 public RecyclerAdapter(List<Person> list) { 
  this.list = list; 
 } 
 
 //为ViewHolder设置数据 
 @Override 
 public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
  View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false); 
  ViewHolder viewHolder = new ViewHolder(view); 
  return viewHolder; 
 } 
 
 @Override 
 public void onAttachedToRecyclerView(RecyclerView recyclerView) { 
  super.onAttachedToRecyclerView(recyclerView); 
 } 
 
 //用于创建ViewHolder 
 @Override 
 public void onBindViewHolder(ViewHolder holder, int position) { 
  Person person = list.get(position); 
  holder.nameTv.setText(person.name); 
  holder.ageTv.setText(person.age); 
  holder.imageView.setImageResource(person.photoId); 
 } 
 
 @Override 
 public int getItemCount() { 
  return list.size(); 
 } 
 
 // 删除指定的Item 
 public void removeData(int position) 
 { 
  list.remove(position); 
  // 通知RecyclerView控件某个Item已经被删除 
  notifyItemRemoved(position); 
 
 } 
 // 在指定位置添加一个新的Item 
 public void addItem(Person person,int positionToAdd) 
 { 
  list.add(person); 
  // 通知RecyclerView控件插入了某个Item 
  notifyItemInserted(positionToAdd); 
 } 
 
 public class ViewHolder extends RecyclerView.ViewHolder { 
  TextView nameTv; 
  TextView ageTv; 
  ImageView imageView; 
  public ViewHolder(View itemView) { 
   super(itemView); 
   nameTv = (TextView) itemView.findViewById(R.id.name); 
   ageTv = (TextView) itemView.findViewById(R.id.age); 
   imageView = (ImageView) itemView.findViewById(R.id.avater); 
  } 
 } 
} 

item动画如有需要可以自己手动添加,这个不是今天的重点,这里附上两个不错的开源项目 这里 和 这里

RecyclerView的点击事件

官方文档中并没有给我们类似ListView的OnItemClickListener回调方法,由于RecyclerView比ListView更高级,所以它并没有行或者列的概念,子View可以任意布局,每个子View处理自己的onClick事件,也就是说在Adapter中给子view的rootview设置点击回调。
我们今天所要实现的是另外一种方式,类似ListView的OnItemClickListener的方式。通过文档我们知道RecyclerView留给开发者一个RecyclerView.OnItemTouchListener接口,我们要做的就是实现它,实现点击的回调和长按回调。当然了,这种方式只是一个开始,我们还可以拓展为各种复杂的手势操作的回调

public class RecyclerItemClickListener implements RecyclerView.OnItemTouchListener{ 
 private View childView; 
 private RecyclerView touchView; 
 public RecyclerItemClickListener(Context context, final OnItemClickListener mListener) { 
  mGestureDetector = new GestureDetector(context, new GestureDetector.SimpleOnGestureListener(){ 
   @Override 
   public boolean onSingleTapUp(MotionEvent ev) { 
    if (childView != null && mListener != null) { 
     mListener.onItemClick(childView, touchView.getChildPosition(childView)); 
    } 
    return true; 
   } 
   @Override 
   public void onLongPress(MotionEvent ev) { 
    if (childView != null && mListener != null) { 
     mListener.onLongClick(childView, touchView.getChildPosition(childView)); 
    } 
   } 
  }); 
 } 
 
 GestureDetector mGestureDetector; 
 
 public interface OnItemClickListener { 
  public void onItemClick(View view, int position); 
  public void onLongClick(View view, int posotion); 
 } 
 
 @Override 
 public boolean onInterceptTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { 
  mGestureDetector.onTouchEvent(motionEvent); 
  childView = recyclerView.findChildViewUnder(motionEvent.getX(), motionEvent.getY()); 
  touchView = recyclerView; 
  return false; 
 } 
 
 @Override 
 public void onTouchEvent(RecyclerView recyclerView, MotionEvent motionEvent) { 
 
 } 
} 

我们在onInterceptTouchEvent的方法中注册了手势操作,当有特定的手势的时候我们就可以通过SimpleGestureListener回调接口接收到,其中我们实现了 点击和长按,然后回调我们自己定义的接口。使用也很简单

recyclerView.addOnItemTouchListener(new RecyclerItemClickListener(this, 
    new RecyclerItemClickListener.OnItemClickListener() { 
   @Override 
   public void onItemClick(View view, int position) { 
    Log.d(TAG, "onItemClick : postion " + position); 
   } 
 
   @Override 
   public void onLongClick(View view, int posotion) { 
    Log.d(TAG, "onLongClick position : " + posotion); 
   } 
  })); 

对于手势操作我们可以定义更多用于对itemView的操作回调。

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


# Android  # RecyclerView  # 点击事件  # Android XRecyclerView最简单的item点击事件处理  # Android中解决RecyclerView各种点击事件的方法  # Android RecyclerView的Item点击事件实现整理  # Android使用RecyclerView实现自定义列表、点击事件以及下拉刷新  # Android Recyclerview实现左滑删除功能  # Android开发使用RecyclerView添加点击事件实例详解  # 回调  # 的是  # 自定义  # 几种  # 文档  # 自己的  # 都是  # 还可以  # 如有  # 可以说  # 给我们  # 我们可以  # 也很  # 对其  # 要做  # 较多  # 所示  # 带了  # 只是一个  # 所要 


相关文章: 如何在Windows 2008云服务器安全搭建网站?  如何通过主机屋免费建站教程十分钟搭建网站?  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  深圳网站制作平台,深圳市做网站好的公司有哪些?  简单实现Android文件上传  网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?  建站主机选购指南:核心配置优化与品牌推荐方案  制作旅游网站html,怎样注册旅游网站?  网站制作需要会哪些技术,建立一个网站要花费多少?  如何在云服务器上快速搭建个人网站?  深圳网站制作的公司有哪些,dido官方网站?  韩国服务器如何优化跨境访问实现高效连接?  C++ static_cast和dynamic_cast区别_C++静态转换与动态类型安全转换  如何在阿里云完成域名注册与建站?  西安专业网站制作公司有哪些,陕西省建行官方网站?  黑客如何通过漏洞一步步攻陷网站服务器?  建站主机数据库如何配置才能提升网站性能?  家庭服务器如何搭建个人网站?  建站之星CMS建站配置指南:模板选择与SEO优化技巧  专业制作网站的公司哪家好,建立一个公司网站的费用.有哪些部分,分别要多少钱?  如何配置FTP站点权限与安全设置?  广州建站公司哪家好?十大优质服务商推荐  如何在阿里云虚拟主机上快速搭建个人网站?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  如何零基础开发自助建站系统?完整教程解析  网站制作的步骤包括,正确网址格式怎么写?  阿里云网站制作公司,阿里云快速搭建网站好用吗?  如何高效搭建专业期货交易平台网站?  武汉网站设计制作公司,武汉有哪些比较大的同城网站或论坛,就是里面都是武汉人的?  ,怎么用自己头像做动态表情包?  建站之星安装提示数据库无法连接如何解决?  定制建站平台哪家好?企业官网搭建与快速建站方案推荐  如何通过虚拟机搭建网站?详细步骤解析  成都网站制作价格表,现在成都广电的单独网络宽带有多少的,资费是什么情况呢?  大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?  如何制作一个表白网站视频,关于勇敢表白的小标题?  如何快速搭建FTP站点实现文件共享?  山东云建站价格为何差异显著?  建站之星如何配置系统实现高效建站?  如何通过免费商城建站系统源码自定义网站主题与功能?  成都品牌网站制作公司,成都营业执照年报网上怎么办理?  建站之星安装后如何自定义网站颜色与字体?  如何在Golang中指定模块版本_使用go.mod控制版本号  制作证书网站有哪些,全国城建培训中心证书查询官网?  实例解析angularjs的filter过滤器  如何用腾讯建站主机快速创建免费网站?  如何快速上传自定义模板至建站之星?  Android自定义listview布局实现上拉加载下拉刷新功能 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。