ViewHolder 模式在 Android 中大家应该都不陌生了,特别是在 ListView 中通过 ViewHolder 来减少 findViewById 的调用和 类型的转换。

而 HolderView 模式是把 ViewHolder 给业务逻辑化,不再仅仅只是保存一些 View, 还要带有业务逻辑。 HolderView 的一个示例如下:

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
import android.content.Context;
import android.content.pm.PackageManager.NameNotFoundException;
import android.content.res.Resources.NotFoundException;
import android.graphics.drawable.Drawable;
import android.os.SystemClock;
import android.text.format.DateUtils;
import android.util.AttributeSet;
import android.widget.ImageView;
import android.widget.RelativeLayout;
import android.widget.TextView;
 
public class NotificationLayoutItem extends RelativeLayout {
 
public NotificationLayoutItem(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
 
public NotificationLayoutItem(Context context, AttributeSet attrs) {
super(context, attrs);
}
 
public NotificationLayoutItem(Context context) {
super(context);
}
 
private ImageView mIcon;
private TextView mText;
private TextView mTime;
 
@Override
protected void onFinishInflate() {
super.onFinishInflate();
mIcon = (ImageView) findViewById(R.id.notif_icon);
mText = (TextView) findViewById(R.id.notif_text);
mTime = (TextView) findViewById(R.id.notif_time);
}
// 业务逻辑代码
public void setData(NotificationData data) {
mText.setText(data.tickerText);
mTime.setText(formatTime(data.time));
Drawable icon;
try {
icon = getContext().getPackageManager().getResourcesForApplication(data.packageName.toString()).getDrawable(data.icon);
mIcon.setImageDrawable(icon);
} catch (NotFoundException e) {
e.printStackTrace();
} catch (NameNotFoundException e) {
e.printStackTrace();
}
}
 
private CharSequence formatTime(long time) {
return DateUtils.formatDateTime(getContext(), time, DateUtils.FORMAT_SHOW_TIME);
}
 
}
1234567891011121314151617181920212223242526272829
<?xml version="1.0" encoding="utf-8"?>
<org.goodev.NotificationLayoutItem xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content" >
 
<ImageView
android:id="@+id/notif_icon"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_centerVertical="true" />
 
<TextView
android:id="@+id/notif_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentRight="true" />
 
<TextView
android:id="@+id/notif_text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_centerVertical="true"
android:layout_toLeftOf="@id/notif_time"
android:layout_toRightOf="@id/notif_icon"
android:ellipsize="none"
android:maxLines="2" />
 
</org.goodev.NotificationLayoutItem>
view rawlayout_item.xml hosted with ❤ by GitHub

可以看到,现在设置数据的逻辑 放到该 HolderView 中了, 这样关于该模块的功能就集中在一起了,不是散落到 Adapter (或者其他地方) 的 getView 中了。

经过几个项目的试验, 个人发现通过 HolderView 可以让代码维护起来更加方便,查找起来比较模块化。

VIA:jayway

ViewHolder VS HolderView ?的更多相关文章

  1. 代码优化>>>Android ListView适配器三级优化详解

    转载本专栏每一篇博客请注明转载出处地址,尊重原创.此博客转载链接地址:点击打开链接  http://blog.csdn.net/qq_32059827/article/details/52718489 ...

  2. Android之ListView性能优化——使用ConvertView和ViewHolder

    使用ConvertView和ViewHolder的优化是针对ListView的Adapter(BaseAdapter)的.这种优化的优点如下: 1)重用了ConveertView,在很大程度上减少了内 ...

  3. ViewHolder优化2>:

    ViewHoder优化:     @Override         public View getView(int position, View convertView, ViewGroup par ...

  4. Android知识——ViewHolder的作用与用法

    ViewHolder通常出现在适配器里,为的是listview滚动的时候快速设置值,而不必每次都重新创建很多对象,从而提升性能.在android开发中Listview是一个很重要的组件,它以列表的形式 ...

  5. 万能Adapter以及ViewHolder性能优化

    //CommonAdapter import android.content.Context; import android.widget.BaseAdapter; import java.util. ...

  6. listview的ViewHolder优化

    1.自定义listview,首先在activity.xml中插入一个listview,可以用android:divider=""设置分割线颜色样式,android:dividerH ...

  7. ViewHolder的改进写法

    先看看ViewHolder通用写法         ViewHolder holder = null;         if(convertView == null){                 ...

  8. 转载:ViewHolder为什么声明为static

    转自:http://www.cnblogs.com/bluestorm/p/5867061.html ListView优化中ViewHolder要不要定义为static静态内部类?   给学生讲课的时 ...

  9. ListView优化为何ViewHolder用static类(转载)

    如果有人还不了解ViewHolder为什么可以起到优化作用,我这边再做下简单说明:Android的findViewById动作是比较耗时的,需要遍历布局的树形结构,才能找到相应的视图.所以如果想在这一 ...

随机推荐

  1. CXF整合Spring开发WebService

    刚开始学webservice时就听说了cxf,一直没有尝试过,这两天试了一下,还不错,总结如下: 要使用cxf当然是要先去apache下载cxf,下载完成之后,先要配置环境变量,有以下三步: 1.打开 ...

  2. Oracle 安装安全补丁过程中出现的问题

    为Oracle安装安全补丁,首先在官网上下载相应版本的补丁. 根据官方文档的说明安装,但是在安装的过程中会出项各种各样的错误,这里仅仅把我遇到的记录下来,给大家提供参考. 首先按照官方文档安装. 在这 ...

  3. iOS UIKit:CollectionView之布局(2)

    Collection view使用UICollectionViewFlowLayout对象来管理section中的cell,该对象是一种流布局方式,即在collection view中的section ...

  4. django开发框架之jumpserver

    发现一个不错的开源堡垒机 jumpserver: https://github.com/ibuler/jumpserver 最开始看的是jumpserver2.0.0 版本,具体的实现方式是: 1. ...

  5. Genymotion无法启动Virtual Box

    Genymotion是非常快速的Android模拟器.这两天搞了一下Android Studio,想用Genymotion跑起一下,但死活都启动不了.很奇怪,明明几个月前还顺利启动的. Genymot ...

  6. Js 直接下载保存文件

    //直接下载保存文件 function Download(filePath) { // 如果中间IFRAME不存在,则添加 if (!document.getElementById("_SA ...

  7. Memcache简介

    简介 Memcache是一个高性能的分布式的内存对象缓存系统,通过在内存里维护一个统一的巨大的hash表,它能够用来存储各种格式的数据,包括图像.视频.文件以及数据库检索的结果等.简单的说就是将数据调 ...

  8. python基础知识十

    特殊的方法 在类中有一些特殊的方法具有特殊的意义,比如__init__和__del__方法,它们的重要性我们已经学习过了. 一般说来,特殊的方法都被用来模仿某个行为.例如,如果你想要为你的类使用x[k ...

  9. Java验证码代码

    public class VerifyCodeController { private int width = 90;//定义图片的width private int height = 20;//定义 ...

  10. Java file文件的写入和读取及下载

    File文件的写入 一.FileWriter 和BufferedWriter 结合写入文件 FileWriter是字符流写入字符到文件.默认情况下,它会使用新的内容代替文件原有的所有内容,但是,当指定 ...