RecyclerView可以用来代替ListView来展现大量的数据。Google在RecyclerView中提升了性能,和更多好用的API。

简单介绍RecyclerView

使用RecyclerView不仅需要设置adapter,还需要设计值layout manager

  1. 要创建adapter,需要继承并实现RecyclerView.AdapterRecyclerView.ViewHolderRecyclerView专门对view holder这部分的API做了一些优化。
/**
* Created by uncle_charlie on 7/4/2016.
*/
class CategoryRecyelerAdapter(var context: Context, var categoryList: ArrayList<CategoryInfo>)
: RecyclerView.Adapter<CategoryRecyelerAdapter.CategoryViewHolder>() { override fun onBindViewHolder(holder: CategoryViewHolder?, position: Int) {
val categoryInfo = categoryList.get(position)
Picasso.with(context).load(categoryInfo.imageUrl)
.resize(80, 80)
.into(holder?.categoryImageView)
} override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): CategoryViewHolder? {
val layoutView = LayoutInflater.from(context).inflate(R.layout.category_grid_item, null)
var viewHolder = CategoryViewHolder(layoutView)
return viewHolder
} override fun getItemCount(): Int {
return categoryList.count()
} inner class CategoryViewHolder(var categoryView: View) : RecyclerView.ViewHolder(categoryView) {
var categoryImageView: ImageView? = null;
var categoryTextView: TextView? = null; init {
categoryImageView = categoryView.findViewById(R.id.product_imageview) as ImageView
categoryTextView = categoryView.findViewById(R.id.product_textview) as TextView
}
}
}
  • CategoryViewHolder继承RecyclerView.ViewHolder。构造函数需要一个View类型的参数。使用这个view来获得view holder里hold的view,比如这里的image view和text view。
  • onCreateViewHolder() 创建view holder。val layoutView = LayoutInflater.from(context).inflate(...),解析RecyclerView的每一个item的layout。并把这个解析之后的view传入前面说的view holder。
  • onBindViewHolder(),这里就是给view holder里的view赋值,比如这里用Picasso给image view设置图片:Picasso.with(context)...into(holder?.categoryImageView)
  • getItemCount()数据源里有多少数据。

Item的点击

但是RecyclerView里完全没有OnItemClickListener这个存在。不过,我们有这个:RecyclerView.OnItemTouchListener 但是RecyclerView.OnItemTouchListener只能响应一次tap事件。当然,有了这个tap,后面就可以扩展了。

/**
* Created by uncle_charlie on 7/4/2016.
*/
class RecyclerItemClickListener(var context: Context, listener: OnItemClickListener)
: RecyclerView.OnItemTouchListener {
private var mListener: OnItemClickListener? = null
private var gestureListener: GestureDetector? = null interface OnItemClickListener {
fun onItemClick(view: View, position: Int)
} init {
this.mListener = listener
gestureListener = GestureDetector(context, object : GestureDetector.SimpleOnGestureListener() {
override fun onSingleTapUp(e: MotionEvent?): Boolean {
return true
}
})
} override fun onTouchEvent(rv: RecyclerView?, e: MotionEvent?) {
throw UnsupportedOperationException()
} override fun onInterceptTouchEvent(rv: RecyclerView?, e: MotionEvent?): Boolean {
var childView = rv?.findChildViewUnder(e!!.x, e!!.y)
if (childView != null && mListener != null && gestureListener!!.onTouchEvent(e)) {
mListener?.onItemClick(childView, rv!!.getChildAdapterPosition(childView))
return true
}
return false
} override fun onRequestDisallowInterceptTouchEvent(disallowIntercept: Boolean) {
throw UnsupportedOperationException()
}
}

如何使用:

  recyclerView.addOnItemTouchListener(RecyclerItemClickListener(activity,
object : RecyclerItemClickListener.OnItemClickListener {
override fun onItemClick(view: View, position: Int) {
categoryPresenter?.onItemClicked(position)
}
}))

参考:

RecyclerView怎么能没有ItemClickListener?加一个!的更多相关文章

  1. RecyclerView因版本问题无法加载

    前几天在学习RecyclerView时候,一直失败,各种加载不上.下面是错误信息 D/AndroidRuntime: Shutting down VM E/AndroidRuntime: FATAL ...

  2. C++在字符串前加一个L作用:

    在字符串前加一个L作用:    如 L"我的字符串" 表示将ANSI字符串转换成unicode的字符串,就是每个字符占用两个字节.    strlen("asd" ...

  3. oracle 中的trunc()函数及加一个月,一天,一小时,一分钟,一秒钟方法

    返回处理后的数据,不同于round()(对数值进行四舍五入处理),该函数不对指定小数前或后的数值部分进行舍入处理. 语法:trunc(number[,decimals]) 其中,number为待做处理 ...

  4. iOS圆形图片裁剪,以及原型图片外面加一个圆环

    废话不多说,直接上代码 #import "ViewController.h" @interface ViewController () @property (nonatomic,s ...

  5. 如何给div加一个边框border样式

    如何给div加一个边框样式? 对div盒子加一个边框样式很简单只需要使用border板块样式即可. 一.虚线与实线边框 边框虚线样式:dashed 边框实现样式:solid border:1px da ...

  6. sh里没有多行注释,只能每一行加一个#号

    sh里没有多行注释,只能每一行加一个#号.只能像这样: #-------------------------------------------- # 这是一个自动打ipa的脚本,基于webfrogs ...

  7. express4.0之后不会解析req.files,必须加一个插件multer

    express 4 + 用multer express4.0之后不会解析req.files,必须加一个插件multer http://www.w3school.com.cn/tags/att_form ...

  8. iOS 给UITextView加一个placeholder

    苹果并没有为UITextView提供placeholder功能.我们可以通过两种办法实现. 方法一: 思路:设置默认显示的文字,颜色设置为灰色.代理方法监听textView点击. 缺点:如果点击到文字 ...

  9. [UE4]快速移动,给单位向量加一个力

    一.(Vector_End- Vector_Start ).Normalize,获取从起始位置指向目标位置的单位向量. 二.给单位向量乘以一个浮点数,即给向量加一个力,是往向量方向移动 每一帧往目标点 ...

  10. 通过JS 给这个input加一个事件 获得焦点,回车事件绑定

    通过JS 给这个input加一个事件 就是获得焦点就行了 window.onload = function(){ var oInput = document.getElementById(" ...

随机推荐

  1. Django 模板语言 路由 视图

    . 模板语言(字符串替换) . 母版和继承 . 什么时候用母版? html页面有重复的代码,把它们提取出来放到一个单独的html文件. (比如:导航条和左侧菜单) . 子页面如何使用母版? {% ex ...

  2. hdu 1254(两个BFS) 推箱子

    http://acm.hdu.edu.cn/showproblem.php?pid=1254 首先,要判断人是不是可以从4到达箱子的位置2,而且不止判断一次,因为推动箱子一步后,人的位置也会改变,所以 ...

  3. instanceof 和 typeof

    instanceof 运算符用来检测 constructor.prototype 是否存在于参数 object 的原型链 function Person(){ Person.prototype.dan ...

  4. (O)JS高阶函数应用——函数节流

    在一些函数需被频繁调用的场景,如:window.onresize.mousemove.scroll滚动事件.上传进度等等,操作频繁导致性能消耗过高,而造成浏览器卡顿现象,我们可以通过函数节流的方式解决 ...

  5. [Jmeter] 在jenkins上通过命令行运行时,针对单个listener生成的chart报告,并通过邮件发送出来

    We need to use cmdrunner-2.0.jar Firstly, download cmdrunner-2.0.jar from here:https://jmeter-plugin ...

  6. cpp 区块链模拟示例(七) 补充 Merkle树

    Merkle 树 完整的比特币数据库(也就是区块链)需要超过 140 Gb 的磁盘空间.因为比特币的去中心化特性,网络中的每个节点必须是独立,自给自足的,也就是每个节点必须存储一个区块链的完整副本.随 ...

  7. 使用yarn 安装 Vue-DevTools

    1. 从 github 下载 vuejs/vue-devtools https://github.com/vuejs/vue-devtools/archive/dev.zip 2.安装yarn 及 编 ...

  8. Windows 平台 (UWP)应用设计

    Make Your Apps Cooperate with Cross-App Communication :  https://rewards.msdn.microsoft.com/Challeng ...

  9. 论Java的重要性

    最近,最新的世界编程语言排名最近出炉了,Java位居世界第一.          不仅如此,Java以17.856%超过第二名C语言的8.726%两倍以上,其实,这一现象是十分反常的,因为,在前几年, ...

  10. mysql中的handler_read_%

    mysql> show status like 'handler_read_%'; +-----------------------+-------+ | Variable_name | Val ...