大家都对viewholder模式并不陌生吧,避免了重复调用findViewbyId,并对convertview进行重用。但是,开发中可能会有这样的困扰,每次在创建Adapter类时,总会有许多的重复代码,比如每次都要创建一个ViewHolder类等等。为了解决这种问题,封装了viewholder模式的EasyAdapter就应运而生。在保持adapter的优化的同时,减轻你每次都需要重复去造轮子,也让你只需关心model数据的变化。EasyAdapter下载地址(https://github.com/mapleyuan/EasyAdapterHelper)。简单的使用方法如下:

listView.setAdapter(new EasyAdapter(getApplicationContext(), R.layout.listview_item, datas) {

@Override

public void convert(BaseViewHolderHelper viewHolderHelper, String data) {

viewHolderHelper.setTextView(R.id.textView, data);

}

});

那假如我们要快速创建一个下面的聊天界面的adapter该如何做呢?

adapter代码示例如下:

public class ChatViewAdapter extends EasyAdapter {

public ChatViewAdapter(Context context, List<MessageModle> datas) {

super(context, datas, new EasyAdapter.IMultiItem<MessageModle>() {

@Override

public int getResource(int position, MessageModle doubleChatMessage) {

return doubleChatMessage.mIsFrom ? R.layout.chatview_list_right_item : R.layout.chatview_list_left_item;

}

@Override

public int getViewTypeCount() {

return 2;

}

@Override

public int getItemViewType(int position, MessageModle doubleChatMessage) {

return doubleChatMessage.mIsFrom ? 0 : 1;

}

});

}

@Override

public void convert(BaseViewHolderHelper viewHolderHelper, MessageModle data) {

if (data.mType == MessageModle.MESSAGE_TYPE_TEXT) {

viewHolderHelper.setTextView(R.id.chatview_maincontent_text_id, data.mContent);

viewHolderHelper.setVisibility(R.id.chatview_maincontent_image_id, View.GONE);

viewHolderHelper.setVisibility(R.id.chatview_maincontent_text_id, View.VISIBLE);

} else {

viewHolderHelper.setVisibility(R.id.chatview_maincontent_image_id, View.VISIBLE);

viewHolderHelper.setVisibility(R.id.chatview_maincontent_text_id, View.GONE);

}

}

public static class MessageModle {

public static final int MESSAGE_TYPE_TEXT = 1;

public static final int MESSAGE_TYPE_ATTACHMENT = 2;

boolean mIsFrom;

/**

* @see {@link #MESSAGE_TYPE_TEXT}

*/

int mType;

public String mContent;

public MessageModle(boolean isFrom, int type, String content) {

mIsFrom = isFrom;

mType = type;

mContent = content;

}

}

可以看到,我们只需要继承EasyAdapter类并实现其convert()方法,就可以直接使用了。假如你对这个项目有兴趣,欢迎下载使用(https://github.com/mapleyuan/EasyAdapterHelper),有任何建议也欢迎跟我交流。

封装使用ViewHolder模式的Adapter组件,及用其快速实现聊天界面的更多相关文章

  1. 设计模式模式适配器(Adapter)摘录

    23种子GOF设计模式一般分为三类:创建模式.结构模型.行为模式. 创建模式抽象的实例,他们帮助建立一个系统,是独立于如何.这是一个这些对象和陈述的组合.创建使用继承一个类架构更改实例,一个对象类型模 ...

  2. Android中利用ViewHolder优化自定义Adapter的典型写法

    利用ViewHolder优化自定义Adapter的典型写法 最近写Adapter写得多了,慢慢就熟悉了. 用ViewHolder,主要是进行一些性能优化,减少一些不必要的重复操作.(WXD同学教我的. ...

  3. React Native封装Toast与加载Loading组件

    React Native开发封装Toast与加载Loading组件 在App开发中,我们避免不了使用的两个组件,一个Toast,一个网络加载Loading,在RN开发中,也是一样,React Nati ...

  4. vue-class-component 以class的模式写vue组件

    vue英文官网推荐了一个叫vue-class-component的包,可以以class的模式写vue组件.vue-class-component(以下简称Component)带来了很多便利: 1.me ...

  5. Mozilla Firefox 将获得包含 Tor 模式的扩展组件

    据外媒报道,Firefox 浏览器可能很快就会收到一个 Tor 模式的附加组件,它将通过连接 Tor 网络显著增强隐私功能.虽然 Mozilla 和 Tor 团队的最终目标是在浏览器上实现完整功能的 ...

  6. 封装Vue Element的table表格组件

    上周分享了几篇关于React组件封装方面的博文,这周就来分享几篇关于Vue组件封装方面的博文,也好让大家能更好地了解React和Vue在组件封装方面的区别. 在封装Vue组件时,我依旧会交叉使用函数式 ...

  7. 封装React AntD的dialog弹窗组件

    前一段时间分享了基于vue和element所封装的弹窗组件(封装Vue Element的dialog弹窗组件),今天就来分享一个基于react和antD所封装的弹窗组件,反正所使用的技术还是那个技术, ...

  8. Transform组件C#游戏开发快速入门

    Transform组件C#游戏开发快速入门大学霸 组件(Component)可以看作是一类属性的总称.而属性是指游戏对象上一切可设置.调节的选项,如图2-8所示.本文选自C#游戏开发快速入门大学霸   ...

  9. 在WEB项目中调用QQ通讯组件打开QQ聊天界面

    在很多WEB项目中,需要提供在线服务的功能,加上自己的联系方式,例如:QQ,不用添加QQ好友也可以交谈,那这到底是怎么实现的呢? 对于这个功能,需要提到一个组件,即“QQ通讯组件”.QQ通讯组件是一种 ...

随机推荐

  1. hdu More is better

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1856 题意:王老师要找一些男生帮助他完成一项工程.要求最后挑选出的男生之间都是朋友关系,可以说直接的, ...

  2. Oracle Global Finanicals Technical Reference(一个)

    Skip Headers Oracle Global Finanicals Oracle Global Financials Technical Reference Manual Release 11 ...

  3. linux_mac_配置itrem2 rz sz_bug处理

    0:传输 .jar 等文件有问题 是  添加 sz -bye  以二进制流方式传输 1:安装  homebrew 2: brew install lrzsz 3:搜索 iterm2-recv-zmod ...

  4. 信号量机制DOWN操作和UP操作的详细说明

    DOWN操作:linux内核.信号DOWN例如,下面的操作: void down(struct semaphore *sem); //不间断 int down_interruptible(struct ...

  5. 表达式树 Expression

    转载泛型方法动态生成表达式树 Expression public string GetGridJSON(TraderInfo model) { IQueryable<TraderInfo> ...

  6. HDU 3639 Hawk-and-Chicken(Tarjan缩点+反向DFS)

    Problem Description Kids in kindergarten enjoy playing a game called Hawk-and-Chicken. But there alw ...

  7. C--控制语句循环例子

    C的三种循环while.for和do  while 先说一下scanf()函数的返回值问题 当scanf("%d,%d",&a,&b);如果用户正确输入了俩个整形变 ...

  8. Spark入门级小玩

    ·背景 随着周边吐槽hadoop的声音渐渐多起来之后,spark也逐渐进入了大家的视野.之前,笔者有粗略的写过一篇spark的安装和性能比较[http://www.cnblogs.com/zacard ...

  9. C# - Recommendations for Abstract Classes vs. Interfaces

     The choice of whether to design your functionality as an interface or an abstract class can somet ...

  10. PHP添加Mssql/sqlserver2000扩展,适用于Php5.2/Php5.3/Php5.4

    原文:PHP添加Mssql/sqlserver2000扩展,适用于Php5.2/Php5.3/Php5.4 本文介绍如何在Windows下配置php扩展. 本文链接 http://blog.csdn. ...