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

请无限参考此文章: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

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-10-13 03:25:12

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

ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程

原文:ASP.NET MVC+EF框架+EasyUI实现权限管理系列(3)-面向接口的编程 ASP.NET MVC+EF框架+EasyUI实现权限管系列 (开篇)  (1)框架搭建    (2):数据库访问层的设计Demo 前言:这篇博客在数据访问层的基础上面我们继续学习对这个Demo的开发,希望大家都好好理解一下这个Demo的架构,到最后我实现权限的时候我就简单的说一下搭建过程就OK了,因为这个Demo的思想就是按照权限的设计方式去设计的,下面我们开始介绍面向接口的编程思想,如果感觉好的话可以

python系统管理第1章,python中执行命令,python函数,面向对像编程,通过import语句实现代码复用

1.Python中执行命令 例子1: [[email protected] opt]# cat pyls.py  #!/usr/bin/env python #python wrapper for the ls command import subprocess     subprocess.call(["ls","-l"]) 例子2: [[email protected] opt]# cat pysysinfo.py  #!/usr/bin/env python

面向对象的编程和面向过程的编程有什么区别

C语言是面向过程的编程,它的最重要特点是函数,通过主函数来调用一个个子函数.程序运行的顺序都是程序员决定好了的.它是我学的第一种程序语言. C++是面向对象的编程,类是它的主要特点,程序执行过程中,先由主函数进入,定义一些类,根据需要,执行类的成员函数,过程的概念被淡化了(实际上过程还是有的,就是主函数的那些语句),类就是对象,所以我们称之为面向对象程序设计. 不同点:1.编程模型 所有计算机均由两种元素组成:代码和数据.精确的说,有些程序是围绕着"什么正在发生"而编写,有些则是围绕&

【C++系列小结】面向过程的编程风格

前言 编程语言有面向过程和面向对象之分,因此编程风格也有所谓的面向过程的编程和面向对象的编程,而且语言的性质不会限制编程的风格. 这里主要说一下面向过程的编程. "面向过程"(Procedure Oriented)是一种以过程为中心的编程思想. C语言是面向过程的编程语言,但是依然可以写出面向对象的程序,同样C++也当然可以写出面向过程的程序咯. 如果我们把所有的程序代码都写在一个main函数里面,那么这个程序显然会显得很不和谐吧.理想一点的做法是我们把一些看起来和main函数逻辑上关

功件与面向功件编程

自从计算机出现以来,计算机硬件和软件的发展轨迹完全不同,计算机硬件的发展可以用波澜壮阔来形容,从电子管.晶体管发展到集成电路.大规模集成电路,CPU从单核发展到多核,显示器从电子屏发展到液晶屏,硬件技术和产品不断更新换代,硬件生产力不断出现飞跃式发展:而计算机软件却一直以一种缓慢的速度发展,虽然编程语言从二机制.汇编语言发展到了高级语言,各种软件技术和框架不断涌现,但软件产品生产力的提升非常缓慢.回头看近二十年计算机硬件生产力和软件生产力的发展速度,我们会发现,软件生产力的发展速度,远远低于硬件

由java小例子到针对(面向)接口编程

在进行Java编程中经常用到以下类似的代码, List<String> strs = new ArrayList<String>(); 只知这是多态,像是一种规范而不知为何如此. 编程时针对超类型(父类)进行编程,也就是说变量的声明类型(或方法的返回类型)是超类型,而不是具体的某个子类.超类型中的各个方法的具体实现不在超类型中,而是在各个子类中.这样在程序执行时可以根据实际状况执行到真正的(某个子类)行为.这样带来的好处是,我们在声明一个变量时无需关心以后执行时的真正的数据类型是哪

Windows编程中的堆管理(过于底层,一般不用关心)

摘要: 本文主要对Windows内存管理中的堆管理技术进行讨论,并简要介绍了堆的创建.内存块的分配与再分配.堆的撤销以及new和delete操作符的使用等内容. 关键词: 堆:堆管理 1 引言 在大多数Windows应用程序设计中,都几乎不可避免的要对内存进行操作和管理.在进行大尺寸内存的动态分配时尤其显的重要.本文即主要对内存管理中的堆管理技术进行论述. 堆(Heap)实际是位于保留的虚拟地址空间中的一个区域.刚开始时,保留区域中的多数页面并没有被提交物理存储器.随着从堆中越来越多的进行内存分

面向函数范式编程(Functional programming)

函数编程(简称FP)不只代指Haskell Scala等之类的语言,还表示一种编程思维,软件思考方式,也称面向函数编程. 编程的本质是组合,组合的本质是范畴Category,而范畴是函数的组合. 首先,什么是函数式编程,这并没有唯一定义,它只是广泛聚合了一些编程风格的特性,我们可以将它与面向对象编程OOP进行对比, 两者区别是,OOP主要聚焦于数据的区别,而FP则注重数据结构的一致性. 面向对象: 数据和对数据的操作紧紧耦合 .对象隐藏它们操作的实现细节,其他对象调用这些操作只需要通过接口. .

Swift中面向协议的编程

什么是面向协议的编程? 面向协议的编程,是一种编程范式. 编程范式,是一个计算机科学用语.维基百科中的解释是,计算机编程的基本风格或典型模式.通俗来说,就是解决某一个问题的方法不同方法和思路. 像大家很熟悉的,面向对象编程以及面向过程编程,都是一种编程范式. 面向过程编程,关心的焦点是解决某一个问题需要多少步.而面向对象的编程关心的是解决问题需要多少个对象,以及这些对象之间的组织联系. 解释完了编程范式这个名字含义之后,我们继续回到正题上来. 既然面向协议编程,与面向对象,面向过程一样,是一种编