Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Kotlin入门(23)适配器的进阶表达

Kotlin入门(23)适配器的进阶表达

作者头像
aqi00
发布于 2019-01-18 09:27:24
发布于 2019-01-18 09:27:24
1.8K00
代码可运行
举报
文章被收录于专栏:老欧说安卓老欧说安卓
运行总次数:0
代码可运行

前面在介绍列表视图和网格视图时,它们的适配器代码都存在视图持有者ViewHolder,因为Android对列表类视图提供了回收机制,如果某些列表项在屏幕上看不到了,则系统会自动回收相应的视图对象。随着用户的下拉或者上拉手势,已经被回收的列表项要重新加载到界面上,倘若每次加载都得从头创建视图对象,势必增加了系统的资源开销。所以ViewHolder便应运而生,它在列表项首次初始化时,就将其视图对象保存起来,后面再次加载该视图时,即可直接从持有者处获得先前的视图对象,从而减少了系统开销,提高了系统的运行效率。 视图持有者的设计理念固然美好,却苦了Android开发者,每次由BaseAdapter派生新的适配器类,都必须手工处理视图持有者的相关逻辑,实在是个沉重的负担。有鉴于此,循环视图的适配器把视图持有者的重用逻辑剥离出来,由系统自行判断并处理持有者的重用操作。开发者继承RecyclerView.Adapter之后,只要完成业务上的代码逻辑即可,无需进行BaseAdapter视图持有者的手工重用。 现在由Kotlin实现循环视图的适配器类,综合前面两小节提到的优化技术,加上视图持有者的自动重用,适配器代码又得到了进一步的精简。由于循环视图适配器并不提供列表项的点击事件,因此开发者要自己编写包括点击、长按在内的事件处理代码。为方便理解循环适配器的Kotlin编码,下面以微信的公众号消息列表为例,给出对应的消息列表Kotlin代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//ViewHolder在构造时初始化布局中的控件对象
class RecyclerLinearAdapter(private val context: Context, private val infos: MutableList<RecyclerInfo>) : RecyclerView.Adapter<ViewHolder>(), OnItemClickListener, OnItemLongClickListener {
    val inflater: LayoutInflater = LayoutInflater.from(context)

    //获得列表项的数目
    override fun getItemCount(): Int = infos.size

    //创建整个布局的视图持有者
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        val view: View = inflater.inflate(R.layout.item_recycler_linear, parent, false)
        return ItemHolder(view)
    }

    //绑定每项的视图持有者
    override fun onBindViewHolder(holder: ViewHolder, position: Int) {
        val vh: ItemHolder = holder as ItemHolder
        vh.iv_pic.setImageResource(infos[position].pic_id)
        vh.tv_title.text = infos[position].title
        vh.tv_desc.text = infos[position].desc
        // 列表项的点击事件需要自己实现
        vh.ll_item.setOnClickListener { v ->
            itemClickListener?.onItemClick(v, position)
        }
        vh.ll_item.setOnLongClickListener { v ->
            itemLongClickListener?.onItemLongClick(v, position)
            true
        }
    }

    //ItemHolder中的属性在构造时初始化
    inner class ItemHolder(view: View) : RecyclerView.ViewHolder(view) {
        var ll_item = view.findViewById(R.id.ll_item) as LinearLayout
        var iv_pic = view.findViewById(R.id.iv_pic) as ImageView
        var tv_title = view.findViewById(R.id.tv_title) as TextView
        var tv_desc = view.findViewById(R.id.tv_desc) as TextView
    }

    private var itemClickListener: OnItemClickListener? = null
    fun setOnItemClickListener(listener: OnItemClickListener) {
        this.itemClickListener = listener
    }

    private var itemLongClickListener: OnItemLongClickListener? = null
    fun setOnItemLongClickListener(listener: OnItemLongClickListener) {
        this.itemLongClickListener = listener
    }

    override fun onItemClick(view: View, position: Int) {
        val desc = "您点击了第${position+1}项,标题是${infos[position].title}"
        context.toast(desc)
    }

    override fun onItemLongClick(view: View, position: Int) {
        val desc = "您长按了第${position+1}项,标题是${infos[position].title}"
        context.toast(desc)
    }
}

以上的适配器代码初步实现了公众号消息列表的展示页面,具体的列表效果如下图所示。

可是这个循环适配器RecyclerLinearAdapter仍然体量庞大,细细观察发现其实它有着数个与具体业务无关的属性与方法,譬如上下文对象context、布局载入对象inflater、点击监听器itemClickListener、长按监听器itemLongClickListener等等,故而完全可以把这些通用部分提取到一个基类,然后具体业务再从该基类派生出特定的业务适配器类。根据这种设计思路,提取出了循环视图基础适配器,它的Kotlin代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//循环视图基础适配器
abstract class RecyclerBaseAdapter<VH : RecyclerView.ViewHolder>(val context: Context) : RecyclerView.Adapter<RecyclerView.ViewHolder>(), OnItemClickListener, OnItemLongClickListener {
    val inflater: LayoutInflater = LayoutInflater.from(context)

    //获得列表项的个数,需要子类重写
    override abstract fun getItemCount(): Int

    //根据布局文件创建视图持有者,需要子类重写
    override abstract fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder

    //绑定视图持有者中的各个控件对象,需要子类重写
    override abstract fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int)

    override fun getItemViewType(position: Int): Int = 0

    override fun getItemId(position: Int): Long = position.toLong()

    var itemClickListener: OnItemClickListener? = null
    fun setOnItemClickListener(listener: OnItemClickListener) {
        this.itemClickListener = listener
    }

    var itemLongClickListener: OnItemLongClickListener? = null
    fun setOnItemLongClickListener(listener: OnItemLongClickListener) {
        this.itemLongClickListener = listener
    }

    override fun onItemClick(view: View, position: Int) {}    override fun onItemLongClick(view: View, position: Int) {}
}

一旦有了这个基础适配器,实际业务的适配器即可由此派生而来,真正需要开发者编写的代码一下精简了不少。下面便是个循环视图的网格适配器,它实现了类似淘宝主页的网格频道栏目,具体的Kotlin代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//把公共属性和公共方法剥离到基类RecyclerBaseAdapter,
//此处仅需实现getItemCount、onCreateViewHolder、onBindViewHolder三个方法,以及视图持有者的类定义
class RecyclerGridAdapter(context: Context, private val infos: MutableList<RecyclerInfo>) : RecyclerBaseAdapter<RecyclerView.ViewHolder>(context) {

    override fun getItemCount(): Int = infos.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val view: View = inflater.inflate(R.layout.item_recycler_grid, parent, false)
        return ItemHolder(view)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val vh = holder as ItemHolder
        vh.iv_pic.setImageResource(infos[position].pic_id)
        vh.tv_title.text = infos[position].title
    }

    inner class ItemHolder(view: View) : RecyclerView.ViewHolder(view) {
        var ll_item = view.findViewById(R.id.ll_item) as LinearLayout
        var iv_pic = view.findViewById(R.id.iv_pic) as ImageView
        var tv_title = view.findViewById(R.id.tv_title) as TextView
    }
}

改进后的循环网格适配器,运行之后的界面效果如下图所示,无缝实现了原来需要数十行Java代码才能实现的功能。

然而基类不过是雕虫小技,Java也照样能够运用,所以这根本不入Kotlin的法眼,要想超越Java,还得拥有独门秘笈才行。注意到适配器代码仍然通过findViewById方法获得控件对象,可是号称在Anko库的支持之下,Kotlin早就无需该方法就能直接访问控件对象了呀,为啥这里依旧靠老牛拉破车呢?其中的缘由是Anko库仅仅实现了Activity活动页面的控件自动获取,并未实现适配器内部的自动获取。不过Kotlin早就料到了这一手,为此专门提供了一个插件名叫LayoutContainer,只要开发者让自定义的ViewHolder继承该接口,即可在视图持有者内部无需获取就能使用控件对象了。这下不管是在Activity代码,还是在适配器代码中,均可将控件名称拿来直接调用了。这么神奇的魔法,快来看看Kotlin的适配器代码是如何书写的:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//利用Kotlin的插件LayoutContainer,在适配器中直接使用控件对象,而无需对其进行显式声明
class RecyclerStaggeredAdapter(context: Context, private val infos: MutableList<RecyclerInfo>) : RecyclerBaseAdapter<RecyclerView.ViewHolder>(context) {

    override fun getItemCount(): Int = infos.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val view: View = inflater.inflate(R.layout.item_recycler_staggered, parent, false)
        return ItemHolder(view)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        (holder as ItemHolder).bind(infos[position])
    }

    //注意这里要去掉inner,否则运行报错“java.lang.NoSuchMethodError: No virtual method _$_findCachedViewById”
    class ItemHolder(override val containerView: View?) : RecyclerView.ViewHolder(containerView), LayoutContainer {
        fun bind(item: RecyclerInfo) {
            iv_pic.setImageResource(item.pic_id)
            tv_title.text = item.title
        }
    }
}

当然,为了能够正常使用该功能,需要在适配器代码头部加上以下两行代码,其中第一行代码表示引用了Kotlin的扩展插件LayoutContainer,第二行代码与Activity的一样表示导入了指定布局文件里面所有控件对象:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import kotlinx.android.extensions.LayoutContainer
import kotlinx.android.synthetic.main.item_recycler_staggered.*

另外,因为LayoutContainer是Kotlin针对性提供给Android的扩展插件,所以需要修改模块的build.gradle,在文件末尾添加下面几行配置,表示允许引用安卓插件库:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
androidExtensions {
    experimental = true
}

即使修改后的适配器代码用了新插件,外部仍旧同原来一样给循环视图设置适配器,调用代码并无任何变化:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //第一种方式:使用采取了LayoutContainer的插件适配器
    val adapter = RecyclerStaggeredAdapter(this, RecyclerInfo.defaultStag)
    rv_staggered.adapter = adapter

采用了新的适配器插件,似乎已经大功告成,可是依然要书写单独的适配器代码,仔细研究发现这个RecyclerStaggeredAdapter还有三个要素是随着具体业务而变化的,包括: 1、列表项的布局文件资源编码,如R.layout.item_recycler_staggered; 2、列表项信息的数据结构名称,如RecyclerInfo; 3、对各种控件对象的设置操作,如ItemHolder类的bind方法; 除了以上三个要素,RecyclerStaggeredAdapter内部的其余代码都是允许复用的,因此,接下来的工作就是想办法把这三个要素抽象为公共类的某种变量。对于第一个的布局编码,可以考虑将其作为一个整型的输入参数;对于第二个的数据结构,可以考虑定义一个模板类,在外部调用时再指定具体的数据类;对于第三个的bind方法,若是Java编码早已束手无策,现用Kotlin编码正好将该方法作为一个函数参数传入。依照三个要素的三种处理对策,进而提炼出来了循环适配器的通用类RecyclerCommonAdapter,详细的Kotlin代码示例如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
//循环视图通用适配器
//将具体业务中会变化的三类要素抽取出来,作为外部传进来的变量。这三类要素包括:
//布局文件对应的资源编号、列表项的数据结构、各个控件对象的初始化操作
class RecyclerCommonAdapter<T>(context: Context, private val layoutId: Int, private val items: List<T>, val init: (View, T) -> Unit): RecyclerBaseAdapter<RecyclerCommonAdapter.ItemHolder<T>>(context) {

    override fun getItemCount(): Int = items.size

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
        val view: View = inflater.inflate(layoutId, parent, false)
        return ItemHolder<T>(view, init)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val vh: ItemHolder<T> = holder as ItemHolder<T>
        vh.bind(items.get(position))
    }

    //注意init是个函数形式的输入参数
    class ItemHolder<in T>(val view: View, val init: (View, T) -> Unit) : RecyclerView.ViewHolder(view) {
        fun bind(item: T) {
            init(view, item)
        }
    }
}

有了这个通用适配器,外部使用适配器只需像函数调用那样传入这三种变量就好了,具体调用的Kotlin代码如下所示:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    //第二种方式:使用把三类可变要素抽象出来的通用适配器
    val adapter = RecyclerCommonAdapter(this, R.layout.item_recycler_staggered, RecyclerInfo.defaultStag,
            {view, item ->
                val iv_pic = view.findViewById(R.id.iv_pic) as ImageView
                val tv_title = view.findViewById(R.id.tv_title) as TextView
                iv_pic.setImageResource(item.pic_id)
                tv_title.text = item.title
            })
    rv_staggered.adapter = adapter

最终出炉的适配器仅有十行代码不到,其中的关键技术——函数参数真是不鸣则已、一鸣惊人。至此本节的适配器实现过程终于落下帷幕,一路上可谓是过五关斩六将,硬生生把数十行的Java代码压缩到不到十行的Kotlin代码,经过不断迭代优化方取得如此彪炳战绩。尤其是最后的两种实现方式,分别运用了Kotlin的多项综合技术,才能集Kotlin精妙语法之大成。

点此查看Kotlin入门教程的完整目录

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018年10月09日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
深入浅出 RecyclerView
原文:http://kymjs.com/code/2016/07/10/01 作者:kymjs张涛 今天推荐给各位的是张涛同学最近的一篇文章,说实话,RecyclerView 的文章挺多的,但像这样由浅入深,一步步讲到源码实现工作原理的不是那么多,推荐大家阅读。 起深入浅出这名字的时候我是慎重又慎重的,生怕被人骂标题党,写的什么破玩意还敢说深入浅出。所以还是请大家不要抱着太高的期望,因为没有期望就没有失望,就像陈润说的,超预期嘛。全当看小说的心情来看这系列文章了。 这篇文章分几个部分,简单跟大家讲一下 R
顶级程序员
2018/05/03
1.7K0
深入浅出 RecyclerView
Android RecyclerView浅析(分类型)
整体上看RecyclerView架构,提供了一种插拔式的体验,高度的解耦,异常的灵活,通过设置它提供的不同LayoutManager,ItemDecoration , ItemAnimator实现令人瞠目的效果。
程序员飞飞
2020/02/27
1.1K0
简易理解设计模式之:适配器模式——Android列表视图控件设计方式
Target(目标角色):所期待得到的接口,即目标接口。 Adaptee(被适配角色):即源接口,一般是已存在的类,现在需要适配新的接口。 Adapter(适配器角色):适配器把源接口(被适配角色)转成转换成目标接口(目标角色)。
Twcat_tree
2022/11/29
7250
简易理解设计模式之:适配器模式——Android列表视图控件设计方式
Kotlin入门(22)适配器的简单优化
为实现各种排列组合类的视图(包括但不限于Spinner、ListView、GridView等等),Android提供了五花八门的适配器用于组装某个规格的数据,常见的适配器有:数组适配器ArrayAdapter、简单适配器SimpleAdapter、基本适配器BaseAdapter、翻页适配器PagerAdapter。适配器的种类虽多,却个个都不好用,以数组适配器为例,它与Spinner配合实现下拉框效果,其实现代码纷复繁杂,一直为人所诟病。故而在下拉框一小节之中,干脆把ArrayAdapter连同Spinner一股脑都摒弃了,取而代之的是Kotlin扩展函数selector。 到了列表视图ListView这里,与之搭档的一般是基本适配器BaseAdapter,这个BaseAdapter更不简单,基于它的列表适配器得重写好几个方法,还有那个想让初学者撞墙的ViewHolder。总之,每当要实现类似新闻列表、商品列表之类的页面,一想到这个难缠的BaseAdapter,心里便发怵。譬如下图所示的六大行星的说明列表,左侧是图标,右边为文字说明,很普通的一个页面。
aqi00
2019/01/18
1.4K0
Android开发笔记(一百二十二)循环器视图RecyclerView
RecyclerView是Android在support-v7库中新推出控件,中文别名为循环器视图,它的功能非常强大,可分别实现ListView、GridView,以及瀑布流网格的显示效果。 RecyclerView相关工程在sdk中的路径为sdk\extras\android\support\v7\recyclerview,不过幸好用它不像用Toolbar那样麻烦,要想使用Toolbar得先导入并引用v7-appcompat工程(具体步骤参见《Android开发笔记(一百一十九)工具栏Toolbar》),而使用RecyclerView只需像其他第三方jar一样往libs目录添加android-support-v7-recyclerview.jar就好了。 但是若在Eclipse/ADT中调用RecyclerView,可能app运行时会报错“Caused by: java.lang.NoClassDefFoundError: android.support.v7.recyclerview.R$styleable”,这时就不能使用sdk\extras\android\support\v7\recyclerview下面的jar包,而要到extras/android/m2repository/com/android/support/recyclerview-v7目录下,在版本号21.0.0的子目录中找到recyclerview-v7-21.0.0.aar,该aar文件其实是个压缩文件,解压该文件可得到classes.jar,将该jar包更名并加入到你的工程,上面的运行错误应该就没有了。  下面看看强悍的RecyclerView都提供了哪些常用方法: setAdapter : 设置列表项的适配器。有关适配器的详细说明见下一标题。 setLayoutManager : 设置列表项的布局管理器。目前有三种,分别是:线性布局管理器LinearLayoutManager、网格布局管理器GridLayoutManager、瀑布流网格布局管理器StaggeredGridLayoutManager。有关布局管理器的详细说明见本文的后半部分。 addItemDecoration : 添加列表项的分割线。 removeItemDecoration : 移除列表项的分割线。 setItemAnimator : 设置列表项的增删动画。 addOnItemTouchListener : 添加列表项的触摸监听器。因为RecyclerView没有实现列表项的点击接口,所以开发者可通过这里的触摸监听器来监控用户手势。 removeOnItemTouchListener : 移除列表项的触摸监听器。
aqi00
2019/01/18
2.5K0
【RecyclerView】 一、RecyclerView 最基本用法 ( 添加支持库 | 设置布局文件 | 自定义适配器 )
在 Module 中的 build.gradle 的 dependencies 中配置 RecyclerView 的依赖库 ;
韩曙亮
2023/03/27
1.4K0
【RecyclerView】 一、RecyclerView 最基本用法 ( 添加支持库 | 设置布局文件 | 自定义适配器 )
RecycleView终极封装(添加头、尾)
头布局没什么可说的,在ListView当中可以直接通过addHeaderView()进行添加头布局,但是对于Recyclerview当中,并没有这种直接添加头布局的方法,那么我们就需要通过Adapter当中来实现。
Demo_Yang
2019/03/20
8960
RecycleView终极封装(添加头、尾)
偷懒新姿势,打造属于RecyclerView的万能适配器Adapter和ViewHolder
前言 昨天开始接触江湖口碑很好的RecyclerView,事实上,我已经被她的强大所征服了!资源回收,数据绑定,布局显示,分割线,Item动画多个模块高度解耦,灵活优雅。其实,RecyclerView在使用上已经是相当简单了(个人觉得),但仍有很多代码是可以加以封装的。今天受简书上一篇博文的启发,作为写代码喜欢优(tou)雅(lan)的人,想到了一种封装方式,打造万能适配器,供大家食用。 正统模式: public class SimplerItemAdapter extends RecyclerView.
非著名程序员
2018/02/02
1.4K0
AndroidApp和车机开发:RecyclerView实现触摸和拖放的功能
在现代应用程序中,用户交互性是提供丰富用户体验的关键因素。RecyclerView作为Android中处理列表和网格布局的强大组件,支持多种交互,包括拖放排序。本文指导您如何在RecyclerView中实现拖放功能,使用户能够通过长按和拖动来重新排序列表项,用Kotlin实现
Nimyears
2024/07/09
3100
3-VII-RecyclerView的item操作
点击添加、左滑删除、长按移动交换 RecyclerView的item.gif 1、Item 操作的接口 /** * 作者:张风捷特烈<br/> * 时间:2018/9/17 0017:14:1
张风捷特烈
2018/09/29
7330
3-VII-RecyclerView的item操作
安卓开发_浅谈ListView(自定义适配器)
ListView作为一个实际开发中使用率非常高的视图,一般的系统自带的适配器都无法满足开发中的需求,这时候就需要开发人员来自定义适配器使得ListView能够有一个不错的显示效果 有这样一个Demo ,实现图片文字混合列表 1 package com.example.work; 2 3 import java.util.ArrayList; 4 import java.util.HashMap; 5 import java.util.List; 6 7 8 import android
听着music睡
2018/05/18
9140
可展开Recyclerview适配器支持Header、Footer、Empty、LoadMore
Android RecyclerView的适配器。面对各种列表的需求,急需要梳理一下,抽象出一个快速开发列表的适配器,减小代码量,提高开发效率。 可展开的Adapter支持的功能如下:
jerrypxiao
2021/02/22
7870
可展开Recyclerview适配器支持Header、Footer、Empty、LoadMore
Android 入门程序 Kotlin版(3)--RecyclerView 瀑布流布局
ViewItem的布局,图片与文字上下排列 <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://sch
用户6021899
2021/02/19
1K0
Android 入门程序 Kotlin版(3)--RecyclerView 瀑布流布局
完善RecyclerView,添加首尾视图
在之前学习ListView的时候,有学习过如何给ListView添加列表头和列表尾。但是通过近几期的学习,发现RecyclerView是一个比ListView更加强大和灵活的组件,今天一起来学习如何给RecyclerView添加首尾视图。 首先来简单回顾一下ListView是如何添加列表头和列表尾的,先定义好首尾视图,然后通过addHeaderView和addFooterView两个方法来加载即可,相对来说比较简单。然后在RecyclerView中并未发现类似的方法,那么应该如何为其添加首尾
分享达人秀
2018/02/05
1.2K0
完善RecyclerView,添加首尾视图
简单好用的RecyclerView适配器
给大家推荐个好用RecyclerView适配器,也就是在百篮应用里用到的适配器。为了大家学习方便,这里简单的写下如何使用这个适配器,不做代码具体的分析,有兴趣的可以自己看下源码。当然用过类似的BRAVH可能会觉得已经都这么好的工具了为何还有使用本文的适配器。我觉得有2个优点:
g小志
2018/09/11
1K0
简单好用的RecyclerView适配器
Android开发笔记(一百七十二)第二代翻页视图ViewPager2
正如RecyclerView横空出世取代ListView和GridView那样,Android也推出了二代翻页视图ViewPager2,打算替换原来的翻页视图ViewPager。与ViewPager相比,ViewPager2支持更丰富的界面特效,包括但不限于下列几点: 1、不但支持水平方向翻页,还支持垂直方向翻页; 2、支持RecyclerView.Adapter,允许调用适配器对象的notifyItem***方法,从而动态刷新某项视图; 3、除了当前页,也支持展示左右两页的部分区域; 4、支持在翻页过程中展示自定义的切换动画; 虽然ViewPager2增加了这么棒的功能,但它用起来非常简单,掌握下面几个方法就够了: setAdapter:设置二代翻页视图的页面适配器。 setOrientation:设置二代翻页视图的翻页方向。其中ViewPager2.ORIENTATION_HORIZONTAL表示水平方向,ViewPager2.ORIENTATION_VERTICAL表示垂直方向。 setPageTransformer:设置二代翻页视图的页面转换器,以便展示切换动画。 接下来利用循环适配器搭配二代翻页视图,演示看看ViewPager2的界面效果。注意RecyclerView与ViewPager2拥有各自的AndroidX库,故需修改模块的build.gradle,在dependencies节点内部补充以下两行依赖配置:
aqi00
2020/06/24
2.3K0
Android-UI布局---RecyclerView学习(一)在适配器中自定义长按和点击事件
该处代码只展示了 点击事件,长按事件是一样的做法,无非就是多一个方法了:
wust小吴
2019/07/08
1.3K0
Android学习--RecyclerView
       前面一篇总结了ListView,在这篇我们总结一些这个RecyclerView,我们就从最基本的开始,安卓团队是将RecyclerView定义在support库当中的,因此想要使用RecyclerView这个控件,首先需要在项目的build.gradle中添加相应的依赖库才行。       下面是添加RecyclerView的相应库:(这里的v7:26.0.0-alphal按照自己相应的版本添加)  image.png        添加完后记得点击一下 Sysnc Now 来同步一下  
Mr.RisingSun
2018/01/12
1K0
Android学习--RecyclerView
Android RecyclerView使用简述
  RecyclerView是Android中非常受欢迎的控件,RecyclerView是官方在Android5.0之后新添加的控件,推出用来替代传统的ListView和GridView列表控件,所以如果你还在使用ListView的话可以替换为RecyclerView了。
晨曦_LLW
2022/10/05
2.4K1
Android RecyclerView使用简述
Android入门教程 | RecyclerView使用入门
想必大家对列表的表现形式已经不再陌生。手机上有联系人列表,文件列表,短信列表等等。 本文讲述的是在 Android 开发中用 RecyclerView 来实现列表效果。
Android_anzi
2021/12/14
1.2K0
推荐阅读
相关推荐
深入浅出 RecyclerView
更多 >
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文