【Android】BaseQuickAdapter使用(RecyclerView万能适配器)

这篇具有很好参考价值的文章主要介绍了【Android】BaseQuickAdapter使用(RecyclerView万能适配器)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


前言

RecyclerView是Android用于取代ListView的SDK,它的灵活性和可替代性都比ListView更好,但RecyclerView也存在一些问题: 高度不能自适应、最后一个 Item 显示不全被遮挡等。而无论ListView还是RecyclerView都必不可少地会使用到适配器,其配置比较繁琐。

BaseQuickAdapter 可以对繁琐的适配器进行快速构建,相比原始的RecyclerView.Adapter适配器,能减少70%以上的代码。

本文将使用Kotlin语言来编写,Kotlin作为安卓板块的新语言,集大家之所长,一定程度上提高了开发效率,后续会有介绍。


BRVAH官方使用指南:BRVAH官方使用指南


一、导入依赖

在 build.gradle(Module:app) 的 dependencies 添加:

dependencies {
	implementation 'com.github.CymChad:BaseRecyclerViewAdapterHelper:3.0.4'
}

二、适配器比较

  1. 原始的 RecyclerView.Adapter
class RecyclerAdapter(private val context: Context, private val data: List<String>)
    : RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    
    override fun getItemCount(): Int = data.size
    
    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): RecyclerView.ViewHolder?{
        return MyRecyclerViewHolder(LayoutInflater.from(context)
                    .inflate(R.layout.item_recycler, parent, false))

    }

    //override fun getItemViewType(position: Int): Int{}

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder?, position: Int) {
        holder.textView.text = ""
        holder.textView.setOnClickListener {}
    }

    inner class MyRecyclerViewHolder(view: View) : RecyclerView.ViewHolder(view) {
        var textView: TextView = view.findViewById(R.id.item_tv)
    }
}

原始的 RecyclerView.Adapter 需要编写4~5个方法

1、getItemCount
2、onCreateViewHolder
3、getItemViewType
4、onBindViewHolder
5、MyRecyclerViewHolder自定义ViewHolder

  1. BaseQuickAdapter适配器
class MyAdapter(private val layoutRes: Int) :
    BaseQuickAdapter<String, BaseViewHolder>(layoutRes) {
    override fun convert(holder: BaseViewHolder, item: String) {
        holder.setText(R.id.textView, item)
    }
}

只需要继承BaseQuickAdapter<T, VH>,第一个泛型对应数据类型ItemBean,第二个泛型对应ViewHolder,一般直接填写BaseViewHolder。

然后在convert方法(类似onBindViewHolder方法)中绑定数据、设置事件等,这样只需要编写一个方法即可完成大量的适配工作。

三、基础使用

  1. 添加到 RecycleView
	val layoutManager = LinearLayoutManager(this)
	recyclerView.layoutManager = layoutManager
	val adapter=MyAdapter(R.layout.item_recycler)
	recyclerView.adapter = adapter
  1. 赋值并刷新
	adapter.setNewInstance(data) //或者setNewData(),初始化数据
	adapter.setList(data) //更新数据
  1. holder常用方法
	holder.getView(viewId) //获取控件
	holder.setText(R.id.textView, str) //设置文本
	holder.getView(viewId).setOnClickListener {} //指定控件的点击事件
	holder.getLayoutPosition() //获取当前item的position
  1. 外部添加点击事件
	//item整体点击事件
    adapter.setOnItemClickListener { adapter, view, position ->
        onItemClick(view,position)
    }
    //注册item对应子控件
	adapter.addChildClickViewIds(R.id.item_tv) 
    //item子控件点击事件
    adapter.setOnItemChildClickListener { adapter, view, position ->
        onItemChildClick(view,position)
    }

  1. 添加动画
	adapter.setAnimationWithDefault(type)
	//默认的AnimationType类型:AlphaIn, ScaleIn, SlideInBottom, SlideInLeft, SlideInRight
  1. 添加头部、尾部、空布局
	//添加头部、尾部、空布局
    val footView: View =
        LayoutInflater.from(this).inflate(R.layout.layout_foot, recyclerView, false)
    adapter.setFooterView(footView)
    val headView: View =
        LayoutInflater.from(this).inflate(R.layout.layout_head, recyclerView, false)
    adapter.setHeaderView(headView)
    val emptyView: View =
        LayoutInflater.from(this).inflate(R.layout.layout_empty, recyclerView, false)
    adapter.setEmptyView(emptyView)
  1. 刷新加载相关
	//打开或关闭上拉加载
	adapter.setEnableLoadMore(boolean)
	// 滑动最后一个Item的时候回调onLoadMoreRequested方法
	adapter.setOnLoadMoreListener(requestLoadMoreListener)
	//加载完成
	adapter.loadMoreComplete();
	//加载失败
	adapter.loadMoreFail();
	//加载结束
	adapter.loadMoreEnd();
	//设置自定义加载布局
	adapter.setLoadMoreView(CustomLoadMoreView())
	//如果上拉结束后,下拉刷新需要再次开启上拉监听,需要使用setNewData方法填充数据

	//--------------------
	
	//打开或关闭下拉刷新
	adapter.setUpFetchEnable(true)
	//设置刷新监听
	adapter.setUpFetchListener(BaseQuickAdapter.UpFetchListener(){})
	//设置开始加载的位置
	adapter.setStartUpFetchPosition(2)
  1. 添加拖拽、滑动删除
	val adapter = ItemDragAdapter(mData) // adapter 需要继承 BaseItemDraggableAdapter
	val itemDragAndSwipeCallback = ItemDragAndSwipeCallback(adapter) //拖拽和删除回调
	val itemTouchHelper = ItemTouchHelper(itemDragAndSwipeCallback) 
	itemTouchHelper.attachToRecyclerView(recyclerView)  //绑定 recycleView
	
	// 开启拖拽
	adapter.enableDragItem(itemTouchHelper, R.id.item_tv, true)
	adapter.setOnItemDragListener(onItemDragListener) //实现 OnItemDragListener 接口
	
	// 开启滑动删除
	adapter.enableSwipeItem()
	adapter.setOnItemSwipeListener(onItemSwipeListener) //实现 OnItemSwipeListener 接口

-------------------修订内容:2023-5-15 ----------------------
最新版本已经找不到 BaseItemDraggableAdapter 类了,不知道为什么。
解决办法:第二和第三种后续会在我的博客更新如何使用,配置都比较简单的,百度也能找到

第一种办法:将版本号换成:2.9.30,但是 3.0.4 和 2.9.30 部分类包位置有改动,而且使用写法也有不同,若以前使用过,换版本的话需要对以前的代码全部进行修改
第二种办法:手动实现 RecyclerView 的 ItemTouchHelper 的回调
第三种办法:只是实现侧滑功能,可以使用第三方包:com.mcxtzhang.swipemenulib.SwipeMenuLayout

四、多布局和分组布局

  • 分组布局继承类:

BaseSectionQuickAdapter:快速实现带头部的适配器

  • 多布局继承类:根据需求选择

BaseMultiItemQuickAdapter:适用于类型较少,业务不复杂的场景,便于快速使用
BaseDelegateMultiAdapter:数据类型任意,代理类方式,适用于实体类不方便拓展
BaseProviderMultiAdapter:数据类型任意,不限定ViewHolder类型,单独的自定义ViewHolder类,避免在convert方法中做大量的业务逻辑

1.BaseMultiItemQuickAdapter

数据类必须实现MultiItemEntity接口,需要给每一个数据设置itemType。

class BaseMultiQuickItem(override val itemType: Int, val data: BaseQuickerItem) : MultiItemEntity {
     companion object {
          const val FIRST_TYPE = 1
          const val SECOND_TYPE = 2
     }
}

适配器重写getItemType方法来返回不同的数据类型。

inner class BaseQuickInfoListAdapter :
	 BaseMultiItemQuickAdapter<BaseMultiQuickItem, BaseViewHolder>() {
	 
	 init {
	     addItemType(BaseMultiQuickItem.FIRST_TYPE, R.layout.layout_first_item)
	     addItemType(BaseMultiQuickItem.SECOND_TYPE , R.layout.layout_second_item)
	 }
	
	 override fun convert(holder: BaseViewHolder, itemMulti: BaseMultiQuickItem) {
	     when(holder.itemViewType){
	         BaseMultiQuickItem.FIRST_TYPE  -> {
	             holder.setText(R.id.item_tv, "布局一")
	         }
	         BaseMultiQuickItem.SECOND_TYPE  -> {
	             holder.setText(R.id.item_tv, "布局二")
	         }
	     }
	 }
	}

2.BaseDelegateMultiAdapter

使用代理类的方式,返回布局id和item类型,数据类依然使用 BaseMultiQuickItem。

class DelegateMultiAdapter :
	BaseDelegateMultiAdapter<BaseMultiQuickItem?, BaseViewHolder>() {

	override fun convert(helper: BaseViewHolder, item: BaseMultiQuickItem?) {
	    when (helper.itemViewType) {
	        BaseMultiQuickItem.FIRST_TYPE -> helper.setText(R.id.item_tv,"布局一")
	        BaseMultiQuickItem.SECOND_TYPE -> {
	            when (helper.layoutPosition % 2) {
	                0 -> helper.setText(R.id.item_tv, "布局二 第一种")
	                1 -> helper.setText(R.id.item_tv, "布局二 第二种")
	                else -> {}
	            }
	        }
	        else -> {}
	    }
	}
	
	init {
	    //设置代理,通过内部类返回类型
	    setMultiTypeDelegate(object : BaseMultiTypeDelegate<BaseMultiQuickItem?>() {
	        override fun getItemType(data: List<BaseMultiQuickItem?>, position: Int):Int {
	            when (position % 3) {
	                0 -> return BaseMultiQuickItem.FIRST_TYPE
	                1 -> return BaseMultiQuickItem.SECOND_TYPE
	                else -> {}
	            }
	            return 0
	        }
	    })
	    //将类型和布局绑定
	    getMultiTypeDelegate()
	        ?.addItemType(BaseMultiQuickItem.FIRST_TYPE, R.layout.layout_base_quick_first_item)
	        ?.addItemType(BaseMultiQuickItem.SECOND_TYPE, R.layout.layout_base_quick_second_item)
	}
}

3.BaseProviderMultiAdapter

当有多种条目时,避免在convert方法中做大量的业务逻辑,将每种Item都分离成一个个单独的类,然后整合到适配器中,最大化自定义数据类型。

class ProviderMultiAdapter : BaseProviderMultiAdapter<BaseMultiQuickItem?>() {

	override fun getItemType(data: List<BaseMultiQuickItem?>, position: Int): Int {
	    when (position % 3) {
	        0 -> return BaseMultiQuickItem.FIRST_TYPE
	        1 -> return BaseMultiQuickItem.SECOND_TYPE
	        else -> {}
	    }
	    return 0
	}
	
	init {
	    // 注册 Provider
	    addItemProvider(FirstItemProvider())
	    addItemProvider(SecondItemProvider())
	}
	}

把大量的业务逻辑抽取到了对应的ItemProvider中。

class FirstItemProvider : BaseItemProvider<BaseMultiQuickItem?>() {

    override val itemViewType: Int
        get() = BaseMultiQuickItem.FIRST_TYPE

    override val layoutId: Int
        get() = R.layout.layout_first_item

    //可返回自定义的 ViewHolder
    override fun onCreateViewHolder(parent: ViewGroup, viewType:Int): BaseViewHolder {
        return super.onCreateViewHolder(parent,viewType)
    }

    override fun convert(helper: BaseViewHolder, data: BaseMultiQuickItem?) {
        if (helper.absoluteAdapterPosition % 2 === 0) {
            helper.setText(R.id.item_tv, "")
        } else {
            helper.setText(R.id.item_tv, "")
        }
    }

    override fun onClick(
        helper: BaseViewHolder,
        view: View,
        data: BaseMultiQuickItem?,
        position: Int
    ) {}
}

4.BaseSectionQuickAdapter

数据类需继承SectionEntity抽象类。

class BaseSectionQuickItem(
     override val isHeader: Boolean, 
     bean: BaseQuickerItem
) : SectionEntity<String>()

适配器:

class SectionQuickAdapter(layoutResId: Int, sectionHeadResId: Int, data: MutableList<BaseSectionQuickItem>?) :
	BaseSectionQuickAdapter<BaseSectionQuickItem, BaseViewHolder>(layoutResId, sectionHeadResId, data) {
	override fun convert(helper: BaseViewHolder, item: BaseSectionQuickItem) {
	}
	
	override fun convertHeader(helper: BaseViewHolder, item: BaseSectionQuickItem) {
	}
}

总结

BaseQuickAdapter功能强大,可以实现多布局、上拉刷新、下拉加载、侧滑删除、甚至树状列表等功能,且方便快捷,如果想要提高开发效率,适配器优先推荐使用它。这里可能介绍不全,详细的可参考官方文档。

五一假期的第一天,被迫码字和学习😭文章来源地址https://www.toymoban.com/news/detail-464407.html

到了这里,关于【Android】BaseQuickAdapter使用(RecyclerView万能适配器)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【Android】-- 下拉列表Spinner、适配器Adapter

    Spinner用于从一串列表中选择某项,功能类似于单选按钮的组合。 例: 下拉列表框  XML文件  java代码 layout下创建item_select.xml文件 适配器负责从数据集合中取出对应的数据显示到条目布局上。 SimpleAdapter允许在列表项中同时展示文本与图片 例:  XML文件 java代码 layout下新建

    2023年04月27日
    浏览(37)
  • 一线互联网架构师360°全方面性能调优,android适配器ui

    为什么要使用多进程 对于进程的概念,来到这里的都是编程修仙之人,就不再啰嗦了,相信大家倒着、跳着、躺着、各种姿势都能背出来。 相信很多同学在实际开发中,基本都不会去给app划分进程,而且,在Android中使用多进程,还可能需要编写额外的进程通讯代码,还可能

    2024年04月13日
    浏览(35)
  • 【C++】STL之容器适配器——使用deque适配stack和queue

    个人主页:🍝在肯德基吃麻辣烫 分享一句喜欢的话:热烈的火焰,冰封在最沉默的火山深处。 本文章主要介绍容器适配器的功能,以及一个适配的场景。 容器适配器,按字面意思理解的话,就是用来对一个容器进行匹配的。在C++STL中,容器有:vector,list,deque,map,set等。

    2024年02月16日
    浏览(42)
  • 适配器模式那么强大,该怎么使用呢?

    适配器模式是一种常用的设计模式,它可以将两个不兼容的接口进行转换,从而使它们之间可以进行交互。在业务开发中,我们经常需要将不同的系统或服务进行整合,而这些系统或服务往往有着不同的接口和数据格式。适配器模式提供了一种解决方案,可以帮助我们轻松地

    2024年02月08日
    浏览(35)
  • Python适配器模式介绍、使用方法

    适配器模式(Adapter Pattern) 是一种结构型设计模式,用于将不兼容的接口转换为另一种接口,以便系统间的协同工作。 功能: 适配器模式主要功能是将一个类的接口转换成客户端所期望的另一种接口,以满足系统间接口的兼容性需求。 优点: 提高了系统的灵活性,使得系统具

    2024年02月15日
    浏览(53)
  • 【设计模式】使用适配器模式做补偿设计

    适配器模式是一种 结构型设计模式 ,它提供了一个中间层,通过这个中间层,客户端可以使用统一的接口与具有不同接口的类进行交互,也就是说,将一个接口转换成客户期望的另一个接口,使得原本不兼容的接口能够协同工作。 举个现实中的例子,我们现在的很多轻薄笔

    2024年02月22日
    浏览(35)
  • 【win10网络重置后,网络适配器消失或者不能使用】

    注:此文章为重新整理的版本,旧版本:https://blog.csdn.net/Viwise/article/details/123263847?spm=1001.2014.3001.5502 目录 一、问题描述 【总结】 【过程】 二、方法 1、针对设备问题代码为56的解决方法:安装CCleaner          (1)安装          (2)使用 2、针对设备问题代码不是

    2024年02月01日
    浏览(49)
  • STL容器适配器 -- stack和queue(使用+实现)(C++)

    栈和队列数据结构+画图分析如果对栈和队列的结构不了解的,可以先看该链接的内容 使用stack时需要头文件 #includestack stack是一种容器适配器,用于具有 后进先出 (LIFO)的环境中。只能从容器的一端(栈顶),执行删除、插入和提取操作。 stack是作为容器适配器实现的,容器

    2024年02月14日
    浏览(47)
  • 【C++】通过栈和队列学会使用适配器和优先队列学会仿函数的使用

    🌇个人主页:平凡的小苏 📚学习格言:命运给你一个低的起点,是想看你精彩的翻盘,而不是让你自甘堕落,脚下的路虽然难走,但我还能走,比起向阳而生,我更想尝试逆风翻盘 。 🛸 C++专栏 : C++内功修炼基地 家人们更新不易,你们的👍点赞👍和⭐关注⭐真的对我真

    2024年02月16日
    浏览(35)
  • 第四章 介绍Productions - 连接选项 - 使用文件适配器的业务主机类

    针对特定场景 IRIS 提供专门的业务服务类和已经使用特定适配器的业务操作类: File adapters FTP adapters HTTP and SOAP adapters TCP adapters 要使用这些业务主机,通常不需要执行任何编码。 或实际原因,以下部分可能不会涵盖 IRIS 提供的所有专业业务主机类。要查找指定适配器的所有

    2024年02月05日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包