ListView 优化篇:从 BaseViewHolder 到面向 Holder 的思想

来源:互联网 发布:上海斑马公寓知乎 编辑:程序博客网 时间:2024/06/05 19:48

接上一篇:ListView 优化篇:从 BaseAdapter 到 BaseViewHolder

概述

在实际项目中,我们的项目功能越多,代码就越庞大,有时候一个类代码甚至上千行,各种组件之间耦合度很高,而当别人接手你开发的庞大的模块,维护起来也困难。

所以就想,能否将一个界面分成多个模块,将复杂的功能,慢慢分成一个个小模块,交个不同的人去实现

上篇,已经成功抽取了一个 BaseViewHolder 的基类,为了更好的说明问题,我做了一些小小的修改,代码如下:

public abstract class BaseViewHolder<T> {    private View contentView;    // 构造方法    public BaseViewHolder() {        contentView = initView();    }    // 初始化组件    public abstract View initView();    // 设置数据    public abstract void setData(T data);    // 获取根布局    public View getContentView() {        return contentView;    }}

特点分析

现在这个基类有如下特点:

  • 有自己的根布局
  • 有自己的 init 方法
  • 有对外界提供根布局的方法

所以,它完全就是一个独立的模块。我们可以用它来搭建各种模块。

这里写图片描述

以”开源中国“客户端为例,这个页面是线性布局,整个 Activity 的布局上是四个排列整齐的 FrameLayout 作为容器, 并且模块间划分非常清晰。所以每个部分都可以用一个 Holder 表示,分别是:HeadHolder、IntroHolder、InfoHolder、OptionalHolder,假设用 holder 实现 OptionalHolder 模块,就可以这样写:

public class OptionalHolder<Bean> {    private View contentView;    // 构造方法    public OptionalHolder() {        contentView = initView();    }    public View initView(){        View view = UIUtils.inflate(R.layout.layout_optional);        return view;        // 在此 find 控件    }    // 设置数据    public abstract void setData(Bean data){        // 在此设置数据    }    // 获取根布局    public View getContentView() {        return contentView;    }}

最后,在 Activity 中,便可以,将 holder 的 ContentView 添加到 Framelayout

// 取出父容器ViewGroup vgOptionalContainer = (ViewGroup) findViewById(R.id.layout_optional);// 创建 holderOptionalHolder holder = new OptionalHolder();// 将 holder 的根布局设置给父容器vgOptionalContainer .setData(data); vgOptionalContainer.addView(holder.getContentView());
0 0