如标题,这是一个在列表多类型视图时的一个简化封装方法,减少多余代码,提高复用性,更好迭代扩展,先看视图列表效果图

GitHub:https://github.com/1024477951/FragmentApp

咋一看感觉就是一个普通的列表,但是要讲的也不是效果,可以看到一般im列表页类型毕竟多,代码逻辑较复杂,如果没有好好的复用封装后面冗余过多,扩展麻烦

最普通的写法应该是直接在适配器的bind方法里根据返回的类型,然后switch,码不同的逻辑,因为每个类型的样式都不同,而且逻辑也不一样,所以在没有什么思路的情况下最容易的一种做法

当然,很多人都会想到这样不好,要封装一波,抽象成base,避免switch繁琐的操作,然后在bind里通过base类调用,达到复用的操作,我也觉得这样挺好的,不过后来发现还是可以进一步的优化,而且这样还能在原来的基础上更好的达到复用的效果,

因为这样一来就相当于把逻辑都放在了viewholder里面,这样也就导致了viewholder里面会有很多重复的操作,比如设置头像,变换消息状态等,这样一来是不是觉得还有优化的余地呢,因为基本上每个类型都少不了头像和状态,而且一般样式都是统一的,

所以这就让我生出一个优化的方法来了,把这些共同的地方抽出来当作base,里面的内容视图动态的填充进去,而且如果不想这样或者想完全改变类型的样式也能通过动态设置来解决,达到一个很好扩展的效果

实现思路:

  首先写base xml,把头像状态一些通用的写进去,然后在 createholder 给内容填充处一个容器视图,创建具体的 holder,这一步操作大致跟通常的创建没有什么大区别,区别在于给视图容器填充了内容视图,以往的都是一整个xml直接加载,现在分为了base和内容。

  接下来是封装 baseholder,这样就可以把一些通用的方法操作逻辑写进去,直接在bind里调用,就算没用填充的操作,其实也能直接在base里封装,只是这样的话你在xml里就显的麻烦了,因为假如你的xml样式需要修改一下,那么你每个xml都要去修改

  baseholder写好了,对继承类提供抽象方法,这样可以避免bind的时候转换类型操作,直接通过base方法对每个不同的类型自定义逻辑

这样一来无论是xml还是holder,还是adapter,都是很方便的修改扩展,比如你修改xml里的一个状态图标,只需要在base xml里修改一下就行了,逻辑都不用动,需要修改状态逻辑也只需要在baseholder里面修改一下就行了,每个类型的holder都通用,而差异化的逻辑一般只会在自定义的对应holder里面改下就行了,扩展内容也是根据自己的需求在base或者child里面编写代码,有没有感觉很是适合IM类型适配器,会话列表

GitHub:https://github.com/1024477951/FragmentApp

  

IM多类型holder封装的更多相关文章

  1. 孟老板 ListAdapter封装, 告别Adapter代码 (上)

    BaseAdapter封装(一) 简单封装 BaseAdapter封装(二) Header,footer BaseAdapter封装(三) 空数据占位图 BaseAdapter封装(四) PageHe ...

  2. 孟老板 ListAdapter封装, 告别Adapter代码 (三)

    BaseAdapter系列 ListAdapter封装, 告别Adapter代码 (一) ListAdapter封装, 告别Adapter代码 (二) ListAdapter封装, 告别Adapter ...

  3. Adapter的封装之路

    原文:Adapter的封装之路 一.几种常见列表效果: 假如要用RecyclerView实现下面的几种效果,你会如何实现呢? 效果1:单布局效果   效果2:多布局效果 有多种Item布局   效果3 ...

  4. BaseAdapter日常的封装

    我们日常开发中BaseAdapter使用非常的多,大家有没有想过,再进一步封装,将平常使用的对象集合,利用泛型放入集合中,再也不用每次都重写那几个方法了,当然我也提供我的下载地址(https://gi ...

  5. Android--带你一点点封装项目 MVP+BaseActivity+Retrofit+Dagger+RxJava(一)

    1,其实早就想把这些东西给封装封装的,一直没有时间,今天刚好项目进入到测试阶段了,Bug同事在哪儿测试的飞起,但发现提bug的尽然是我(得意脸),然后上午把ios的包测试了一下,顺便把服务器给测挂了( ...

  6. Android--RecyclerView的封装使用

    1,用了很长一段时间的RecyclerView,在项目中用的频率也越来越频繁(因为踩得坑也越来越多了),或过头来看,感觉一直在写RecyclerView.Adapter中的三个方法和一个内部类,感觉很 ...

  7. android代码优化----ListView中自定义adapter的封装(ListView的模板写法)

    [声明] 欢迎转载,但请保留文章原始出处→_→ 生命壹号:http://www.cnblogs.com/smyhvae/ 文章来源:http://www.cnblogs.com/smyhvae/p/4 ...

  8. RecyclerView再封装

    RecyclerView做为ListView的替代品,已经出了很久了,既然是替代品,那自然有些ListView没有的优点.比如说:可以随意切换list,grid,stagger.可以指定一个或多个it ...

  9. jquery封装常用方法

    var git = { //true表示格式正确 checkEmail: function (str) { -]{,})(\S*)/g) == null) { return false; } else ...

随机推荐

  1. 《k8s-1.13版本源码分析》- Informer 机制

    源码分析系列文章已经开源到github,地址如下: github:https://github.com/farmer-hutao/k8s-source-code-analysis gitbook:ht ...

  2. 学习web的第二天

    之前因为技能大赛的原因,导致我这门课没有上.其实上学期是开Dreamweaver网页制作的课程的,所以老师讲的很快.我就利用课后时间去补漏,今天讲了HTML标签:1.标题标签<h1>~&l ...

  3. redis-dump实现redis库迁移

    最近公司有切换redis库的需求,找了个简单的redis迁移方法,不过也有缺点.就是对于实时性要求很高的redis库迁移无法做到数据的实时同步.不过对于简单的redis库备份和迁移还是可以的,各位看官 ...

  4. 【原】Oracle EBS 11无法打开Form及Form显示乱码的解决

    问题:Oracle EBS 11无法打开Form及Form显示乱码 解决: 1.尝试使用jre1.5或1.6安装目录下jre/bin/server目录里的jvm.dll替换JInitiator安装目录 ...

  5. C#常见金额优选类型及其三种常用的取整方式

    这两天一直在做一个商城后台的对账方面的工作,忽然发现C#真的有很多值的学习的东西: 一.C#常用的三种取整方式(主要适用于double.decimal.float这一类型的数据): Math.Roun ...

  6. 每日分享!~ JavaScript(js数组如何在指定的位置插入一个元素)

      这个想法是在一个面试题中看到的: 题目是这样的: // 一个数组,在指定的index 位置插入一个元素,返回一个新的数组,不改变原来的数组 <script> function inse ...

  7. javascript 实现数据结构 - 栈

    栈是一种遵从后进先出(LIFO)原则的有序集合.新添加的或待删除的元素都保存在栈的同一端,称作栈顶,另一端就叫栈底.在栈里,新元素都靠近栈顶,旧元素都接近栈底.栈就好像是一个底部密封的盒子,我们往里面 ...

  8. 知识小罐头09(tomcat8启动源码分析 下)

    初始化已经完成,现在就是启动这些组件,Tomcat中的start方法就是用于启动的,其实start的原理还是和上一篇说的初始化几乎一样!这里我就大概说一下,看几个比较关键的地方就行了. 前面的步骤就大 ...

  9. Docker系列之入门篇

    Dcoker是什么? 概述 Docker 是世界领先的软件容器平台.开发人员利用 Docker 可以消除协作编码时“在我的机器上可正常工作”的问题.运维人员利用 Docker 可以在隔离容器中并行运行 ...

  10. qs.stringify和JSON.stringify的使用和区别

    qs可通过npm install qs命令进行安装,是一个npm仓库所管理的包. 而qs.stringify()将对象 序列化成URL的形式,以&进行拼接. JSON是正常类型的JSON,请对 ...