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. [z]Libevent使用例子,从简单到复杂

    [z]http://blog.csdn.net/luotuo44/article/details/39670221 本文从简单到复杂,展示如何使用libevent.网上的许多例子都是只有服务器端的,本 ...

  2. c语言使用指针对int数组的求和

    #include <stdio.h> int sump(int *, int *); int main(void) { , , , , }; printf()); ; } int sump ...

  3. Django ORM那些相关操作zi

    Django ORM那些相关操作   一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs) ...

  4. 线程 day40

    操作系统线程理论 线程概念的引入背景 进程 之前我们已经了解了操作系统中进程的概念,程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别 ...

  5. python 验证码 和进度条

    import random def make_code(n): res='' for i in range(n): s1=chr(random.randint(65,90)) s2=str(rando ...

  6. 10.22JS日记

    1.js数据类型分析 (1)基础类型:string.number.boolean.null.undefined (2)引用类型:object-->json.array... 2.点运算  xxx ...

  7. html标签一

    <body></body> 网页内容 <p></p>段落 <h1></h1> ----<h6></h6> ...

  8. linux中的设备类型

    loop设备 loop设备 一.参考命令[root@localhost a]# losetup usage:  losetup loop_device                          ...

  9. BZOJ1079或洛谷2476 [SCOI2008]着色方案

    一道记忆化搜索 BZOJ原题链接 洛谷原题链接 发现对于能涂木块数量一样的颜色在本质上是一样的,所以可以直接压在一个状态,而这题的数据很小,直接暴力开\(6\)维. 定义\(f[a][b][c][d] ...

  10. springboot server.address 配置问题

    1. server.address 为对应机器ip地址时 ,如 18.10.x.x 此时访问该服务只能使用 ip 访问 . 2. 配置为 127.0.0.1 时  可以使用 localhost  和  ...