Android高效并簡(jiǎn)約的使用ListView(二)

BaseListAdapter實(shí)現(xiàn)

public abstract class BaseListAdapter<T> extends BaseAdapter
BaseListAdapter是一個(gè)模板類繼承Android SDK中的BaseAdapter或南,里面可以看到一個(gè)成員對(duì)象
private List<T> list = new ArrayList<>();

通過該對(duì)象裝載Adater中所需要的數(shù)據(jù)焊夸,經(jīng)巢氖В看到有朋友在Adapter的外部持有Adapter中l(wèi)ist引用用來改變Adapter中的數(shù)據(jù)磨淌,其實(shí)這樣會(huì)導(dǎo)致兩個(gè)對(duì)象同時(shí)對(duì)Adapter中的數(shù)據(jù)進(jìn)行改變级遭,風(fēng)險(xiǎn)是不可控的望拖,而且外部的list生命周期在長(zhǎng)于Adapter的時(shí)候會(huì)導(dǎo)致list來不及內(nèi)存回收,如果做了一些非法的操作很容易使得list對(duì)象這塊內(nèi)存逃逸出去挫鸽,比如用一個(gè)static的引用去指向它说敏。在Adapter中增加一些數(shù)據(jù)改變的方法可以避免這一切情況的出現(xiàn),而且很方便丢郊。

/**
     * 初始化list
     *
     * @param list
     */
    public void initList(List<T> list) {
        if (this.list.size() > 0) {
            this.list.clear();
        }
        this.list.addAll(list);
        notifyDataSetChanged();
    }
    
    /**
     * add the list ,but no clear
     *
     * @param list
     */
    public void addList(List<T> list) {
        this.list.addAll(list);
        notifyDataSetChanged();
    }
    
    /**
     * clear all list
     */
    public void clearList() {
        this.list.clear();
        notifyDataSetChanged();
    }
    ```
通過這些方法使得`Adapter`才真正成為`data controller`盔沫, 在每次需要數(shù)據(jù)操作的時(shí)候?qū)Adapter`進(jìn)行發(fā)送消息。
    下面就是真正源碼抽象的過程了:
##1. 首先是getView()方法的抽象
```java
    
    @Override
    public final View getView(int position, View convertView, ViewGroup parent) {
        BaseViewHolder viewHolder = null;
        if (convertView == null) {
            viewHolder = onCreateViewHolder(position, getViewBundles());
            convertView = createView(position, viewHolder);
        } else {
            viewHolder = (BaseViewHolder) convertView.getTag();

        }
        if (convertView == null || convertView.getTag() == null)
            throw new NullPointerException(" creatview fails");
        onSetViewHolder(position, getItem(position), viewHolder);
        return convertView;
    }
    ```
在`getView`中通過`position`參數(shù)實(shí)例化對(duì)應(yīng)的`viewHolder`對(duì)象`onCreateViewHolder`方法會(huì)call`getItemViewType`方法通過子類實(shí)現(xiàn)的`List<ViewBundle> ViewBundles`對(duì)象取得需要的ViewHolder.class類型然而通過反射去實(shí)例化枫匾。
```java  
    protected BaseViewHolder onCreateViewHolder(int pos,List<ViewBundle> ViewBundles){
        Class<? extends BaseViewHolder> clazz = ViewBundles
                .get(getItemViewType(pos)).vHClazz;
        return ViewUtil.getInstance(clazz);
    }

拿到ViewHolder對(duì)象后就可以開始進(jìn)行相應(yīng)的數(shù)據(jù)set了架诞,
onSetViewHolder(position, getItem(position), viewHolder);這個(gè)是set data的方法:

/**
     * set data for viewHolder by viewType(through by getItemViewType)
     *
     * @param position
     * @param bean
     * @param baseViewHolder
     */
    protected void onSetViewHolder(int position, T bean,
                                   BaseViewHolder baseViewHolder) {
        baseViewHolder.setView(bean, getContext());

    }

在onSetViewHolder方法中可以看到回去調(diào)用ViewHolder父類的setView()方法,下面是BaseViewHolder的代碼干茉,通過baseViewHolder.setView(bean, getContext());可以調(diào)用子類的具體實(shí)現(xiàn)谴忧,這樣就解耦了adapter和viewHolder之間的關(guān)聯(lián),并且不需要關(guān)注viewHolder的對(duì)象具體類型(因?yàn)樵趃etViewTypeCount!=1的時(shí)候會(huì)在onBindViewHolder(List<ViewBundle> list)中綁定多個(gè)BaseViewHolder子類的類型)角虫,其實(shí)就是java多態(tài)的使用沾谓。

    public static abstract class BaseViewHolder<T> {
        public BaseViewHolder() {
        }
        protected abstract void setView(T bean, Context context);
        public Class getClassTag() {
            return this.getClass();
        }
    }

2. ViewBundle的職能?

在子類實(shí)現(xiàn)中有這樣的一個(gè)方法onBindViewHolder(List<ViewBundle> list)戳鹅,ViewBundle的作用是什么呢均驶?

    public static class ViewBundle {
        public ViewBundle(int layoutId, Class<? extends BaseViewHolder> clazz) {
            this.layoutId = layoutId;
            this.vHClazz = clazz;
        }

        public Class<? extends BaseViewHolder> vHClazz;
        public int layoutId;

        @Override
        public String toString() {
            return "ViewBundle{" + "vHClazz=" + vHClazz + ", layoutId="
                    + layoutId + '}';
        }
    }

可以看到其實(shí)是一個(gè)layoutId和viewHolder類型的對(duì)應(yīng)關(guān)系,通過list將數(shù)組對(duì)象傳遞給父類枫虏,通過下標(biāo)取得對(duì)應(yīng)的class值妇穴。

到這里代碼解析全部完畢爬虱,主要工作就是Adapter的簡(jiǎn)單定制,讓子類的具體實(shí)現(xiàn)最小化伟骨。這樣的處理在開發(fā)中可以減少相應(yīng)的繁瑣重復(fù)工作并降低錯(cuò)誤率饮潦,父類中輸出了輸出了必要的log并在子類實(shí)現(xiàn)除錯(cuò)的情況跑出了對(duì)應(yīng)的異常,可以很快的定位原因携狭。
有問題請(qǐng)聯(lián)系我:ganquan3640@gmail.com继蜡。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市逛腿,隨后出現(xiàn)的幾起案子稀并,更是在濱河造成了極大的恐慌,老刑警劉巖单默,帶你破解...
    沈念sama閱讀 222,729評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件碘举,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡搁廓,警方通過查閱死者的電腦和手機(jī)引颈,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來境蜕,“玉大人蝙场,你說我怎么就攤上這事×荒辏” “怎么了售滤?”我有些...
    開封第一講書人閱讀 169,461評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)台诗。 經(jīng)常有香客問我完箩,道長(zhǎng),這世上最難降的妖魔是什么拉队? 我笑而不...
    開封第一講書人閱讀 60,135評(píng)論 1 300
  • 正文 為了忘掉前任弊知,我火速辦了婚禮,結(jié)果婚禮上粱快,老公的妹妹穿的比我還像新娘吉捶。我一直安慰自己,他們只是感情好皆尔,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評(píng)論 6 398
  • 文/花漫 我一把揭開白布呐舔。 她就那樣靜靜地躺著,像睡著了一般慷蠕。 火紅的嫁衣襯著肌膚如雪珊拼。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評(píng)論 1 312
  • 那天流炕,我揣著相機(jī)與錄音澎现,去河邊找鬼仅胞。 笑死,一個(gè)胖子當(dāng)著我的面吹牛剑辫,可吹牛的內(nèi)容都是我干的干旧。 我是一名探鬼主播,決...
    沈念sama閱讀 41,179評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼妹蔽,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼椎眯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起胳岂,我...
    開封第一講書人閱讀 40,124評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤编整,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后乳丰,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體掌测,經(jīng)...
    沈念sama閱讀 46,657評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評(píng)論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,872評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖载迄,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評(píng)論 5 351
  • 正文 年R本政府宣布,位于F島的核電站婶熬,受9級(jí)特大地震影響剑勾,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜赵颅,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評(píng)論 3 336
  • 文/蒙蒙 一虽另、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧饺谬,春花似錦捂刺、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至拔鹰,卻和暖如春仪缸,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背列肢。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評(píng)論 1 274
  • 我被黑心中介騙來泰國(guó)打工恰画, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留宾茂,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,304評(píng)論 3 379
  • 正文 我出身青樓拴还,卻偏偏與公主長(zhǎng)得像跨晴,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子片林,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容

  • 前言 如何高效并簡(jiǎn)潔的使用listview端盆,首先自然是關(guān)心如何對(duì)BaseAdapter定制。站在代碼抽象的角度拇厢,子...
    Gavinme閱讀 7,502評(píng)論 1 5
  • 前言 如何高效并簡(jiǎn)潔的使用listview爱谁,首先自然是關(guān)心如何對(duì)BaseAdapter定制。站在代碼抽象的角度孝偎,子...
    Gavinme閱讀 645評(píng)論 0 8
  • 簡(jiǎn)介 在Android開發(fā)中ListView是比較常用的組件访敌。 以列表的形式展示具體內(nèi)容。 并且能夠根據(jù)數(shù)據(jù)的長(zhǎng)度...
    上善若水Ryder閱讀 6,989評(píng)論 2 5
  • 繁世內(nèi)衣盾,往事亦綿遷寺旺,彈指揮間事斷歇;趣談年少念牽纖势决。 書香外阻塑,白墻綠門斑,今日曲終未人散果复;他日離合憶悲歡陈莽。 重上九...
    朝辭暮返行多遠(yuǎn)閱讀 420評(píng)論 1 2
  • 母親買東西總喜歡砍價(jià),而且總是能如得勝般的將軍走出商場(chǎng)虽抄,這可能確實(shí)因?yàn)樗秊榧抑杏质∠铝艘还P不小的開支吧走搁。小時(shí)候...
    木木杪閱讀 280評(píng)論 4 1