面向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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章