大家都对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. android登录界面

    在网上在到一个登录界面感觉挺不错的,给大家分享一下~先看效果图: 这个Demo除了按钮.小猫和Logo是图片素材之外,其余的UI都是通过代码实现的. 一.背景 背景蓝色渐变,是通过一个xml文件来设置 ...

  2. Effective C++之‘宁以pass-by-reference-to-const替换pass-by-value’

    Effective C++之'宁以pass-by-reference-to-const替换pass-by-value' 缺省情况下C++以by value 方式(一个继承自C的方式)传递对象至函数.除 ...

  3. Ubuntu14.04安装一个小问题,搜狗输入法

    罕见的搜狗输入法支持ubuntu.尝试了决定性下载. 官方网站:http://pinyin.sogou.com/linux/ 官网教程:http://pinyin.sogou.com/linux/he ...

  4. 用python+selenium导入excel文件

    连接mysql #encoding=utf-8 import pymysql import time class ConnMysql(object): def __init__(self): self ...

  5. ZOJ 3802 Easy 2048 Again 像缩进DP

    链接:problemId=5334">http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=5334 题意:一个长度为5 ...

  6. CSS3+HTML5特效3 - 纵向无缝滚动

    老惯例,先看例子. This is a test 1. This is a test 2. This is a test 3. This is a test 4. This is a test 5. ...

  7. Java初认识--环境搭建及基本数据类型

    一.JAVA语言的环境搭建 1.JRE(Java Runtime Environment):Java运行环境. 它包括Java虚拟机和Java程序所需的核心类库等. 2.JDK(Java Develo ...

  8. 数据库数据导出成XML文件

    在数据库中,怎样把库中的数据导出XML文件, sql语句如下: SELECT *  FROM 表名 FOR XML AUTO, ELEMENTS

  9. poj3070--Fibonacci(矩阵的高速幂)

    Fibonacci Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9650   Accepted: 6856 Descrip ...

  10. 关于小改CF协同过滤至MapReducer上的一些心得

    至上次重写ID3 MR版之后,手贱继续尝试CF.之前耳闻CF这两年内非常火,论内某大神也给了单机版(90%代码来自于其).所以想试试能否改到MR上.整体来说,CF本身的机制以相似性为核心,与迭代调用几 ...