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

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. WebGL three.js学习笔记 创建three.js代码的基本框架

    WebGL学习----Three.js学习笔记(1) webgl介绍 WebGL是一种3D绘图协议,它把JavaScript和OpenGL ES 2.0结合在一起,通过增加OpenGL ES 2.0的 ...

  2. C# .NET Web API 如何自訂 ModelBinder

    各位好!這次要來替大家介紹的是如何在 .NET  Web API 中自訂一個 ModelBinder 透過自定義的 ModelBinder 我們可以很簡單的將 QueryString 傳過來的參數綁定 ...

  3. [Linux] host dig nslookup查询域名的DNS解析

    root@VM-38-204-ubuntu:~# host baidu.com baidu.com has address 220.181.57.216 baidu.com has address 1 ...

  4. Hive的原理

    阅读目录 一.Hive内部表和外部表 1.Hive的create创建表的时候,选择的创建方式: - create table - create external table 2.特点: ● 在导入数据 ...

  5. sql xml中 in 的用法

    在xml中,动态传参去数据库查询,下面是in的示例. 比如有条sql SELECT * FROM corp_tax c WHERE c.id in (387419,387423) AND c.corp ...

  6. ansible基础-task控制

    1. 前言 很多情况下,一个play是否执行会依赖于某个(些)变量的值,这个变量可以来自自定义变量.facts,甚至是另一个task的执行结果. ansible通过变量判定task是否执行,我们称之为 ...

  7. 6. VIM 系列 - 全局搜索(ctrlsf.vim)

    目录 全局搜索利器 ag.vim 更强大的全局搜索利器 ctrlsf.vim 全局搜索利器 ag.vim 终端上安装ag: sudo apt install silversearcher-ag vim ...

  8. 【Android Studio安装部署系列】十九、Android studio使用SVN

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 概述 在AndroidStudio中开发版本控制,除了Git就是SVN,和Eclipse不同,Android Studio没有提供单独的插 ...

  9. java~springboot~ibatis Invalid bound statement (not found)原因

    事实起因 最近在ORM上使用了ibatis,感觉挺繁琐的,没有jpa来的直接,但项目非要用也没有办法,最近在进行开发过程中出现了一个问题Invalid bound statement (not fou ...

  10. Spring Boot系列(一) Spring Boot准备知识

    本文是学习 Spring Boot 的一些准备知识. Spring Web MVC Spring Web MVC 的两个Context 如下图所示, 基于 Servlet 的 Spring Web M ...