关闭

面向holder的编程,代码更清爽,管理更简单

标签: 代码工作holder思想
3619人阅读 评论(12) 收藏 举报
分类:

请无限参考此文章:http://blog.csdn.net/wanghao200906/article/details/46819101
Listview相信大家都用过了,并且ViewHolder写的次数也不少了。每次使用listview都要写一堆viewholder,当然也要写getview。特别麻烦。其实工作量不大,但都是体力活儿。哎

还有一个更苦逼的如果你是项目管理者,小弟特别菜,他写的代码都写在你的activity里面了,当初bug的时候他果断说不会改,你只能加班自己改。我被坑过无数次,为此很早就想写一个类,让所有代码分工明确不互相干扰,更好的管理

为了有时间撸啊撸那必须封装,好多安卓大神都封装过listview,并且黑马培训机构也提过viewholder的封装,为了让更多的人不加班,更多的有彩笔小弟的小组长们不在加班该别人的bug。
废话不说先看一个动图效果
这里写图片描述

先来简单说下这个动图:
1 上面是一个可以左右滑动的HorizontalScrollView,网络获取图片显示
2 下面呢是一个显示文字的,开始显示文字的前几行,点击滑动到文字的最低端,再点击滑动会来,有个 回弹的效果,gif貌似看的不清楚无所谓啦。
这里面用到的就是
属性动画,
监听,
获取文字前几行的高度和总高度。
属性动画的回弹效果。

我之前的遭遇就是分配给两个小弟干,他们接过都写到了一个activity里面了。结果出了bug,当然最后我来改。小弟还是经理表弟,你懂得。

看似简单其实加起来代码量也是有小一千行了,还没有注释,真想递走人。

那么逼格的来了:

package com.example.holder_design.holder;

import android.view.View;

/**
 * @author wang
 * @version 创建时间:2015年7月2日 下午5:15:41
 *  类说明 所有界面都是 holder的开发
 *  
 *  所有页面都离不开: 网络请求数据和显示页面 并且他们两个宗旨是一样的 但每个页面都各有特色,所以就让子类去实现
 *  先初始化默认的控件,
 *  当网络请求数据的时候在把得到的数据写到控件里面
 *  
 *  总之是 为了避免 因为 界面复杂     而    所有代码都写到一个界面中,进而难以维护,坑自己更坑队友
 */
public abstract class BaseHolder<T> {
    private View contentView;//界面
    private T data;//数据的类型

    //初始化的时候 先初始化空间,再把控件 都写到view里面(类似于listview的 view.setTag(holder))
    public BaseHolder() {
        contentView = initView();
        contentView.setTag(this);
    }
//  读取数据:注意这里的数据已经是  网络加载和json解析完 得到的 数据,
    public void setData(T data) {
        this.data = data;
        refreshView(data);//显示界面
    }
    //把当前的view返回给父类
    public View getView() {
        return contentView;
    }
    /**
     * 初始化各种控件
     * @return view
     */
    protected abstract View initView();
    /**
     * 控件添加各种数据 ,耗时炒作等
     * @param data2
     */
    protected abstract void refreshView(T data);
}

怎么用呢。
直接继承

package com.example.holder_design.holder;

import android.view.View;
import android.widget.ImageView;
import com.example.holder_design.R;
import com.wang.cn.utils.UIUtils;

/**
 * @author wang
 * @version 创建时间:2015年7月9日 下午12:06:48 类说明
 */
public class Horizontalscreen extends BaseHolder<Integer[]> {
    private ImageView[] ivs;
    @Override
    public View initView() {
        View view = UIUtils.inflate(R.layout.screen);
        ivs = new ImageView[5];
        ivs[0] = (ImageView) view.findViewById(R.id.screen_1);
        ivs[1] = (ImageView) view.findViewById(R.id.screen_2);
        ivs[2] = (ImageView) view.findViewById(R.id.screen_3);
        ivs[3] = (ImageView) view.findViewById(R.id.screen_4);
        ivs[4] = (ImageView) view.findViewById(R.id.screen_5);
        return view;
    }

    @Override
    protected void refreshView(Integer[] data) {
        for (int i = 0; i < 5; i++) {
            ivs[i].setVisibility(View.VISIBLE);
            ivs[i].setImageDrawable(UIUtils.getDrawable(data[i]));
        }
    }

}

然后重点来了 只要把他们子空间 addView到activity中就搞定了

package com.example.holder_design;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.FrameLayout;
import android.widget.HorizontalScrollView;
import android.widget.RelativeLayout;

import com.example.holder_design.holder.Horizontalscreen;
import com.example.holder_design.holder.TextHolder;
import com.wang.cn.utils.UIUtils;
import com.wang.cn.utils.ViewUtils;

public class MainActivity extends Activity {
    String url = "http://image.baidu.com/search/detail?ct=503316480&tn=baiduimagedetail&statnum=head&ipn=d&z=0&s=0&ic=0&lm=-1&itg=0&cg=head&word=%E5%A4%B4%E5%83%8F&ie=utf-8&in=3354&cl=2&st=&pn=5&rn=1&di=1445974420&ln=1000&&fmq=1378374347070_R&se=&sme=0&tab=&face=&&is=0,0&cs=2205791892,1328528914&adpicid=0&pi=0&os=2120402291,415210639&istype=&ist=&jit=&objurl=http%3A%2F%2Fp2.gexing.com%2Ftouxiang%2F20120802%2F0922%2F5019d66eef7ed_200x200_3.jpg&bdtype=0&gsm=undefined";
    Integer[] pic={R.drawable.a,R.drawable.b,R.drawable.c,R.drawable.d,R.drawable.e};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//      textview文字下拉的代码
        FrameLayout fl = (FrameLayout) findViewById(R.id.detail_des);
        TextHolder textHolder = new TextHolder();
        textHolder.setData(url);
        fl.addView(textHolder.getView());

//      图片滑动代码
        HorizontalScrollView horizontalscrollview =(HorizontalScrollView) findViewById(R.id.detail_screen);
        Horizontalscreen horizontalholder = new Horizontalscreen();
        horizontalholder.setData(pic);
        horizontalscrollview.addView(horizontalholder.getView());
    }
}

这样是不是就很清爽了。每个界面的布局都不用再activity里面改了
activity就像照片墙,我们只需要不断地往上贴照片,具体的照片拍成什么样,那个就不归activity管了。
还有个好处就是:照片贴的多了,钉子就多了。他就限制了相框大小和布局的选择,拔钉子可不那么容易,但这种方法呢就很好的解决了这个问题再也不会因为他人写的代码太垃圾儿干扰你修改你的代码。
保护眼睛人人有责

下载地址 http://download.csdn.net/detail/wanghao200906/8884391

5
1
查看评论

关于Holder持有者类对象

经常遇到这样的功能,想调用一次方法时希望放回多个对象。 可是return语句却只允许返回一个对象,因此,解决办法只有创建一个对象,用它来持有想要返回的多个对象。 如,可以创建一个DataHolder类: class DataHolder { TextView tv; Sliding...
  • itzyjr
  • itzyjr
  • 2013-10-31 03:08
  • 1420

Holder的使用

  Holder的使用 如果使用javax.xml.rpc.holders.*Holder,JBoss启动WebService时,会报错:Cannot synchronize to any of these methods13:14:19,734 ERROR [Main...
  • yyf365
  • yyf365
  • 2008-08-19 11:06
  • 2913

Android-面向Holder编程

1-拆分界面 2-各个击破 3-贴到墙上 相信大家在Android编程中,应该会有一种体验:一个Activity要执行的功能太多了,导致代码有时甚至上千行,极其不方便阅读和修改,这里,面向Holder编程,就是解决这个问题的一个绝佳方案。 所谓面向Holder编程,其实很简单,就是把一个大的复杂...
  • Fisher0113
  • Fisher0113
  • 2016-03-11 23:37
  • 1440

如何让你的电脑保持清爽

大部分人的电脑中最容易混乱的
  • xiaoyu90520
  • xiaoyu90520
  • 2014-06-23 17:27
  • 944

让管理变得更简单(9)

描述: 图 图片: (价值信息)。 传统的“等级式”企业管理模式,会导致“多层管理、多头领导、政出多门”局面的出现,使得企业管理的信息冗余,准确性差,而且信息资源更多地在部门内部流动,部门之间缺乏沟通,历史数据也不容易查找。这样的管理模式不能满足市场的变化。那么如何才能提...
  • ccidblog1
  • ccidblog1
  • 2006-04-23 01:55
  • 462

小的技巧来使代码变得简洁

<br />在我们写代码的时候可以使用一些小的技巧来使代码变得更加简洁,易于维护和高效。下面介绍几种在C#/Net中非常有用的一些编程技巧。大部分都是3.0以上版本的属性1 空操作符(??)<br />在程序中经常会遇到对字符串或是对象判断null的操作,如果为null则给空...
  • zhvsby
  • zhvsby
  • 2010-11-04 10:40
  • 744

面向Holder编程

概述 在我们实际开发过程中,当我们软件的功能做得多的时候,这个时候我们的代码量也就越来越大了,如果我们不把代码进行封装,不仅让我们开发的时候变得困难,而且不利于维护,特别是团队开发的时候,如果我们一个Activity就几百行,当然几百行也算是少的了,甚至可能上千行。这个时候如果让你看几千行的代码...
  • smile_raccoon
  • smile_raccoon
  • 2016-06-13 10:36
  • 268

面向holder编程

当一个界面中的试图太过于复杂的时候 ,可以将它分成一个一个的holder,每一个模块放在一个holder中,这样使界面里的代码复杂度降低,还可以让每一个模块的开发者独立完成,解耦和。继承baseholder 在activity、fragment等中new一个子类holder然后addViewpack...
  • xk3440395
  • xk3440395
  • 2016-08-17 08:16
  • 202

iOS开发——布局框架Masonry的介绍与使用

平时代码中的视图经常要用CGRectMake(CGFloat x, CGFloat y, CGFloat width, CGFloat height);来布局,不仅代码繁多不好计算而且屏幕适配也很麻烦,这时候就我推荐使用布局框架Masonry,这样可以优化自己的代码,是布局更加简单和简洁。Mason...
  • u012350430
  • u012350430
  • 2016-06-13 18:55
  • 2666

LogStash,使日志管理更简单

James Turnbull,通过对日志管理项目情境中的Logstash实施细节的介绍,给了读者信服的理由去使用Logstash进行集中化的日志管理。 《Logstash》一书通过一个双面案例(two side case)从不同方面进行介绍,其低准入门槛适合小企业使用,其扩展能力使其也...
  • derek518
  • derek518
  • 2015-04-15 09:07
  • 1418