设计思想培养:装饰者模式下的RecyclerView添加头、尾

这篇具有很好参考价值的文章主要介绍了设计思想培养:装饰者模式下的RecyclerView添加头、尾。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

一个高复用、低耦合的代码不会让你在第一次去实现代码的时候感到舒服
但是他会在你后面做扩展、和同类需求的时候,直呼真香!!!

最近写需求,借用到装饰者思想做了RecyclerView的头和尾的扩展
感觉很不错,赶紧拿出来说一说,嘻嘻

ps:本篇文章只是帮助大家,在实现需求的过程中也能潜移默化的使用设计模式来优化代码

Android中的装饰者

首先一句话总结装饰者:就是不通过继承的方式,来扩展某个对象的功能,达到我们想要实现的效果。
举两个小例子,不细说,因为前面已经讲过装饰者模式相关的内容

  • InputStream装饰者

InputStream装饰者:在Android中,我们经常需要读取文件或者网络流。InputStream是用于读取字节流的抽象类,而Android提供了许多装饰者类来扩展InputStream的功能。
例如,BufferedInputStream和DataInputStream都是InputStream的装饰者类,它们添加了缓冲和数据类型转换的功能。

FileInputStream fileInputStream = new FileInputStream("example.txt");
BufferedInputStream bufferedInputStream = new BufferedInputStream(fileInputStream);
DataInputStream dataInputStream = new DataInputStream(bufferedInputStream);
  • View装饰者

Android中的UI组件都继承自View类,而Android提供了装饰者类来扩展View的功能
例如,可以使用LayoutInflater来给布局文件添加一些额外的装饰

LayoutInflater inflater = LayoutInflater.from(context);
View originalView = inflater.inflate(R.layout.original_layout, parentLayout, false);
ViewDecorator viewDecorator = new ViewDecorator(originalView);
View decoratedView = viewDecorator.decorate();
parentLayout.addView(decoratedView);

基于这种思想,在做RecyclerView的头和尾的扩展想到了,利用这种装饰者扩展的方式去加头和尾,而保留中间数据层的原有属性。

代码实现

利用DecorateAdapter去装饰RecyclerView.Adapter,从而扩展HeadView、FooterView
设计思想培养:装饰者模式下的RecyclerView添加头、尾,Android,android,设计模式
中间内容我们使用contentAdapter来表示,假设就是简单的Item结构,就不做代码介绍了。

第一步:创建装饰器DecorateAdapter

创建装饰器DecorateAdapter并实现增加头部和尾部Item的相关方法、和成员变量
并将contentAdapter作为原始的内容列表

class DecorateAdapter(
    val contentAdapter: RecyclerView.Adapter<RecyclerView.ViewHolder>
) : RecyclerView.Adapter<RecyclerView.ViewHolder>(), IdecorateList {

    /**save head View*/
    private val headerList: MutableList<View> by lazy {
        mutableListOf()
    }

    /**save footer view*/
    private val footerList: MutableList<View> by lazy {
        mutableListOf()
    }

    /**常规方法*/
    ......
    ......

    override fun getItemCount(): Int {
        //记得加上contentAdapter的Item条目
        return contentAdapter.itemCount + headerList.size + footerList.size
    }

    override fun addHeaderView(header: View) {
        if (!headerList.contains(header)) {
            headerList.add(header)
            refreshList()
        }
    }

    override fun removeHeaderView(header: View) {
        if (headerList.contains(header)) {
            headerList.remove(header)
            refreshList()
        }
    }

    override fun addFooterView(foot: View) {
        if (!footerList.contains(foot)) {
            footerList.add(foot)
            refreshList()
        }
    }

    override fun removeFooterView(foot: View) {
        if (footerList.contains(foot)) {
            footerList.remove(foot)
            refreshList()
        }
    }

    override fun refreshList() {
        notifyDataSetChanged()
    }
}

第二步:处理头部、中间内容、尾部的绑定关系

  • 处理头部、中间、尾部的不同绑定的视图:也就是createHeaderViewHolder处理
/**创建头部的ViewHolder*/
private fun createHeaderViewHolder(view: View): RecyclerView.ViewHolder {
    return HeaderViewHolder(view)
}

/**创建尾部的ViewHolder*/
private fun createFooterViewHolder(view: View): RecyclerView.ViewHolder {
    return FooterViewHolder(view)
}

override fun onCreateViewHolder(parent: ViewGroup, position: Int): RecyclerView.ViewHolder {

    /**头部样式展示*/
    if (headerList.isNotEmpty() && position in 0 until headerList.size) {
        return createHeaderViewHolder(headerList[position])
    }

    /**中间内容展示*/
    val startPosition = if (headerList.isNotEmpty()) headerList.size else 0
    val endPosition =
        if (headerList.isNotEmpty()) headerList.size + contentAdapter.itemCount else contentAdapter.itemCount
    if (position in startPosition until endPosition) {
        return contentAdapter.onCreateViewHolder(parent, position)
    }

    /**尾部样式展示*/
    return createFooterViewHolder(footerList[position - endPosition]) /**注意这里的取值*/
}
  • 处理处理头部、中间、尾部的数据绑定:也就是onBindViewHolder的处理
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {

    if (headerList.isNotEmpty() && position in 0 until headerList.size) {
        return
    }
    /**中间的内容数据绑定*/
    val startPosition = if (headerList.isNotEmpty()) headerList.size else 0
    val endPosition =
        if (headerList.isNotEmpty()) headerList.size + contentAdapter!!.itemCount else contentAdapter!!.itemCount
    if (position in startPosition until endPosition) {
        /**注意计算的时候,要减去HeadView*/
        contentAdapter?.onBindViewHolder(holder, position - headerList.size)
    }
}

第三步:装饰器的使用

把内容区域的ContentAdapter,通过DecorateAdapter进行包装,之后调用包装后的decorateAdapter进行添加HeadView

decorate = findViewById(R.id.rv_decorate)
val decorateAdapter = DecorateAdapter(ContentAdapter())
decorate.adapter = decorateAdapter
decorate.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)

decorateAdapter.addHeaderView(
    LayoutInflater.from(this).inflate(R.layout.layout_header, decorate, false)
)

第四步:改进、直接封装一个View出来

把装饰者封在内部
毕竟我们在调用的时候,还是想当一个View直接拿来用,改进一下

class decorateRecyclerView : RecyclerView {

    private var DecorateAdapter: DecorateAdapter? = null

    @JvmOverloads
    constructor(context: Context, attributes: AttributeSet? = null) : super(context, attributes)

    override fun setAdapter(adapter: Adapter<ViewHolder>?) {
        DecorateAdapter = DecorateAdapter(adapter!!)
        super.setAdapter(DecorateAdapter)
    }

    fun addHeaderView(header: View) {
        DecorateAdapter?.addHeaderView(header)
    }

    fun removeHeaderView(header: View) {
        DecorateAdapter?.removeHeaderView(header)
    }

    fun addFooterView(foot: View) {
        DecorateAdapter?.addFooterView(foot)
    }

    fun removeFooterView(foot: View) {
        DecorateAdapter?.removeFooterView(foot)
    }
}

调用 & 使用

decorate = findViewById(R.id.rv_decorate)
decorate.adapter = ContentAdapter()
decorate.layoutManager = LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false)

decorate.addHeaderView(
    LayoutInflater.from(this).inflate(R.layout.layout_header, decorate, false)
)
decorate.addFooterView(
    LayoutInflater.from(this).inflate(R.layout.layout_footer, decorate, false)
)

总结

本篇呢,只是想说一下如何去潜移默化的使用设计模式去改变我们的代码。
举了一个扩展RecyclerView头和尾的例子。
如果不用设计模式的话,我想你的头和尾的处理逻辑都是需要冗余在ContentAdapter中的
问题:
1、那么你的ContentAdapter的定义界限是什么?整个页面的业务?那难免太难维护了
2、如果只需要服用ContentAdapter怎么处理?粘贴复制,多造一个类出来?

而通过上面我们介绍的装饰者模式就能解决这两个:复用、耦合的问题文章来源地址https://www.toymoban.com/news/detail-736029.html

到了这里,关于设计思想培养:装饰者模式下的RecyclerView添加头、尾的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 《移动互联网技术》 第十章 系统与通信: 掌握Android系统的分层架构设计思想和基于组件的设计模式

    🌷🍁 博主 libin9iOak带您 Go to New World.✨🍁 🦄 个人主页——libin9iOak的博客🎐 🐳 《面试题大全》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 🌊 《IDEA开发秘籍》学会IDEA常用操作,工作效率翻倍~💐 🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬

    2024年02月16日
    浏览(56)
  • 【C++ 观察者模式 思想理解】C++中的观察者模式:松耦合设计与动态交互的艺术,合理使用智能指针观察者

    在进入技术细节之前,理解观察者模式(Observer Pattern)的基本概念和它在现代编程中的重要性是至关重要的。 观察者模式是一种设计模式,它定义了对象间的一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都得到通知并自动更新。在C++中,这个

    2024年01月24日
    浏览(56)
  • Spring核心设计思想

    目录 前言: Spring是什么 什么是IoC 传统开发思想 IoC开发思想 Spring IoC 什么是DI 小结:     官网中提出:Spring makes programming Java quicker, easier, and safer for everybody. Spring’s focus on speed, simplicity, and productivity has made it the world\\\'s most popular Java framework.     Spring 使编程 Java 对每个人来

    2023年04月17日
    浏览(45)
  • 算法设计思想——动态规划

    是一种常见的算法设计方法,用于解决一类重叠子问题的优化问题。他的基本思想是将问题分解成多个重叠的子问题,递归求解,并将子问题的求解缓存起来,避免重复计算,从而得到问题的解。 动态规划通常适用于以下两个条件的问题: 1.重叠子问题:原问题可以分解为若

    2024年02月03日
    浏览(48)
  • 【Spring】核心与设计思想

     哈喽,哈喽,大家好~ 我是你们的老朋友: 保护小周ღ   谈起Java 圈子里的框架,最年长最耀眼的莫过于 Spring 框架啦,如今已成为最流行、最广泛使用的Java开发框架之一。不知道大家有没有在使用 Spring 框架的时候思考过这些问题, 什么是框架?Spring 是什么?如何理解

    2024年02月08日
    浏览(45)
  • Spring 核心与设计思想

    ✏️作者:银河罐头 📋系列专栏:JavaEE 🌲 “种一棵树最好的时间是十年前,其次是现在” 通常所说的 Spring 指的是 Spring Framework(Spring 框架)。 Spring 是包含多种工具方法的 IoC 容器。 IoC(Inversion of Control): 控制反转 \\\"控制反转\\\"又是什么意思? 下面以一个程序来举例。 假如我

    2024年02月02日
    浏览(58)
  • 闪电网络协议设计思想剖析

    闪电网络可能是比特币之上部署的最受期待的技术创新。闪电网络,为由 Joseph Poon 和 Tadge Dryja 于2015年首次提出的支付层,承诺支持: 用户之间几乎无限数量的链下交易, 几乎免费, 同时利用比特币提供的安全性。 2016年时,至少三个公司——Poon 和 Dryja 的 Lightning、 Block

    2024年03月20日
    浏览(62)
  • Spring框架核心与设计思想

    我们一般所说的Spring指的是Spring Framework(Spring 框架),它是一个开源的框架,Spring支持广泛的应用场景,它可以让Java企业级的应用程序开发变得更简单,官方一点的回答:spring是J2EE应用程序框架,是轻量级的IoC和AOP的容器框架,主要是针对javaBean的生命周期进行管理的轻量级

    2023年04月15日
    浏览(47)
  • 从架构设计思想出发看Flutter

    Flutter 是一种流行的移动应用程序开发框架,它的设计特点之一是可以使用单一代码库构建 iOS 和 Android 应用程序。然而,对于功能比较多、模块比较复杂的应用程序,仅凭单一的代码库就可能导致代码的复杂性和维护难度的增加。在这种情况下,通过合适的应用程序架构设计

    2024年02月07日
    浏览(74)
  • Spring框架概述及核心设计思想

    我们通常所说的 Spring 指的是 Spring Framework(Spring 框架),它是⼀个开源框架,有着活跃而庞大的社区,这就是它之所以能长久不衰的原因;Spring 支持广泛的应用场景,它可以让 Java 企业级的应用程序开发起来更简单。 用⼀句话概括 Spring: Spring 框架是包含了众多工具方法的

    2024年02月16日
    浏览(39)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包