Bamboy非約束列表(俗稱:萬能適配器 )(附源碼)

非約束列表(萬能適配器) v4.0 重磅升級
請移步:
http://www.reibang.com/p/e9558141fb5f

v3.1更新

  • 完善更多下拉刷新場景
  • 增加【上拉分頁加載】和【無感分頁加載】

v3.0更新

  • 增加超強功能的下拉刷新

v2.0更新

  • 增加對團(tuán)隊開發(fā)的支持
  • 增加對混合列表的支持

簡介

非約束列表洒沦,
也是很多同學(xué)口中的“萬能適配器”万搔,
不過我并不認(rèn)同“萬能”的這個說法律适,
誰的適配器ListView和RecyclerView通用刹勃?

預(yù)覽一下效果先:
1贼涩、單列列表

單列列表

2、多列列表

多列列表

3脓规、混合列表

混合列表

顯然链快,
從界面上看不出什么名堂,
那就先說下我的非約束列表有什么優(yōu)勢吧微猖。

打個比方谈息,
某中學(xué)要給10臺電腦升級程序,
平均一臺電腦操作一次需要一個小時凛剥。

初中生可能會操作10次黎茎,
耗時10小時。

高中生可能會把所有電腦連起來当悔,
同時操控傅瞻,
只需要操作一次踢代,
耗時一個小時。

我們用普通的Adapter的話嗅骄,
就好比初中生胳挎,
每次修改一個條目,
就把所有使用這個條目的類全改一遍溺森,
無論是Activity還是Adapter慕爬,
但是用了非約束列表就不一樣了,
邏輯基本上都在Bean里屏积,
基本上只需要改itemLayout的樣式医窿,
和Bean里的邏輯即可。

到這里炊林,
可能有同學(xué)會疑惑姥卢,
為什么不管Adapter?
因為渣聚,
我的項目只需要一個Adapter独榴,
一個Adapter,
全場通用奕枝!

說得細(xì)一點棺榔,
就是我把邏輯全部拆散重組,
Adapter架空隘道,
只負(fù)責(zé)Activity症歇、ViewHolder、bean之間的連通谭梗。
我個人喜歡把View和與其相對應(yīng)的數(shù)據(jù)放一起当船,
所以我把ViewHolder和邏輯放到了Bean里,
通過一個接口來使兩者進(jìn)行結(jié)合默辨,
哦不,
是將數(shù)據(jù)顯示到View上苍息。

但是缩幸,
ViewHolder那么多,
Adapter怎么將其連通起來呢竞思?
所以我寫了一個ViewHolderManager表谊,
ViewHolderManager負(fù)責(zé)根據(jù)條目的類型,
找到相對應(yīng)的ViewHolder盖喷,
進(jìn)行實例化并返回給Adapter爆办。

整體流程如下圖:


freedom

好了,
原理就說到這里课梳,
━━━━━━━━━━━這是清理內(nèi)存的分割線━━━━━━━━━━━
下面開始聊聊我的非約束列表的使用步驟:

一:
新建一個Bean類距辆,
里邊寫個ViewHolder內(nèi)部類余佃,
繼承ViewHolderManager.ViewHolder,
和普通的Adapter的內(nèi)部類差不多跨算,
不過需要注意的是爆土,
構(gòu)造里的參數(shù)不一樣:

/**
 * ViewHolder --> 主頁的按鈕
 */
public static class MusicViewHolder extends ViewHolderManager.ViewHolder {
    public RelativeLayout rl_music;
    public TextView tv_song;
    public TextView tv_singer;

    public MusicViewHolder(ViewGroup viewGroup) {
        // 兩個參數(shù),第一個viewGroup不解釋诸蚕,第二個即本ViewHolder對應(yīng)的LayoutXml
        super(viewGroup, R.layout.item_music);

        rl_music = (RelativeLayout) itemView.findViewById(R.id.rl_music);
        tv_song = (TextView) itemView.findViewById(R.id.tv_song);
        tv_singer = (TextView) itemView.findViewById(R.id.tv_singer);
    }
}

不難發(fā)現(xiàn)步势,
構(gòu)造里多了個參數(shù),
即該ViewHolder對應(yīng)的LayoutXml.

二:
進(jìn)入ViewHolderManager背犯,
對應(yīng)你新寫的ViewHolder坏瘩,
增加一個公開靜態(tài)常量,
只要不與其他的值重復(fù)即可漠魏,
并put到itemMap里倔矾,
key為你剛寫的常量,
value為剛寫的ViewHolder的class蛉幸。

/**
 * 條目類型 --> ……
 */
public static final int //……
/**
 * 條目類型 --> 新聞卡片
 */
public static final int ITEM_TYPE_NEWS = 8;
/**
 * 條目類型 --> 音樂
 */
public static final int ITEM_TYPE_MUSIC = 9;

/**
 * 加載條目類型破讨,以及對應(yīng)的條目XML
 */
static {
    itemMap = new HashMap<>();
    ……
    itemMap.put(ITEM_TYPE_NEWS, BeanNews.NewsViewHolder.class);
    itemMap.put(ITEM_TYPE_MUSIC, BeanMusic.MusicViewHolder.class);
}

三:
回到剛才寫的Bean,
繼承FreedomBean奕纫,
在initItemType()里提陶,
set一下剛在ViewHolderManager里定義的那個常量,

@Override
protected void initItemType() {
    setItemType(ViewHolderManager.ITEM_TYPE_MUSIC);
}

在initBindView()里匹层,
把普通Adapter里onBindViewHolder()的代碼挪過來隙笆。

@Override
protected void initBindView(final List list) {

    setViewHolderBindListener(new ViewHolderBindListener() {
        @Override
        public void onBindViewHolder(final Activity activity, final ViewHolderManager.ViewHolder viewHolder, final int position) {
            final MusicViewHolder vh = (MusicViewHolder) viewHolder;
            final BeanMusic bean = (BeanMusic) list.get(position);

            vh.tv_song.setText(bean.getSong());
            vh.tv_singer.setText(bean.getSinger());

            vh.rl_music.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    ……
                }
            });
        }
    });
}

如果需要和Activity交互,
則Activity實現(xiàn)FreedomCallback接口升筏,
并在onClickCallback里編寫代碼撑柔,
然后回到Bean里調(diào)用getCallback(activity).onClickCallback();

vh.rl_music.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View v) {
        // 點擊事件
        // 如果不需要和Activity進(jìn)行交互,
        // 那么直接在這里寫點擊事件即可
        //
        // 如果需要和Activity進(jìn)行交互您访,
        // 那么Activity實現(xiàn)FreedomCallback接口铅忿,
        // 并在onClickCallback里編寫代碼,
        // 即可觸發(fā)回調(diào)灵汪,
        // 以和Activity進(jìn)行交互檀训。
        //
        // 注意:
        // 該Activity必須實現(xiàn)FreedomCallback接口才能觸發(fā)回調(diào),
        // 否則會報錯
        getCallback(activity).onClickCallback(v, position, vh);
    }
});

例:
類BeanMusic里initBindView方法里的vh.rl_music.setOnClickListener()享言。

好了峻凫,
Bean就完成了,
Activity里使用它的方式和普通的沒什么差別览露,
只是聲明數(shù)據(jù)源mList的時候荧琼,
類型為Object或者不要加類型就好:

/**
 * 數(shù)據(jù)源
 */
 private List mList;

然后就可以使用FreedomAdapter了:

// 實例化RecyclerView
mAdapter = new FreedomAdapter(this, mList);
recycler.setLayoutManager(new LinearLayoutManager(this));
recycler.setItemAnimator(new DefaultItemAnimator());
recycler.setAdapter(mAdapter);

使用起來雖然沒有比普通的簡單太多,
但也功能要比普通的強大太多啊不是么?

本文github鏈接:
https://github.com/Bamboy120315/Freedom

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末命锄,一起剝皮案震驚了整個濱河市堰乔,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌累舷,老刑警劉巖浩考,帶你破解...
    沈念sama閱讀 217,542評論 6 504
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異被盈,居然都是意外死亡析孽,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,822評論 3 394
  • 文/潘曉璐 我一進(jìn)店門只怎,熙熙樓的掌柜王于貴愁眉苦臉地迎上來袜瞬,“玉大人,你說我怎么就攤上這事身堡〉擞龋” “怎么了?”我有些...
    開封第一講書人閱讀 163,912評論 0 354
  • 文/不壞的土叔 我叫張陵贴谎,是天一觀的道長汞扎。 經(jīng)常有香客問我,道長擅这,這世上最難降的妖魔是什么澈魄? 我笑而不...
    開封第一講書人閱讀 58,449評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮仲翎,結(jié)果婚禮上痹扇,老公的妹妹穿的比我還像新娘。我一直安慰自己溯香,他們只是感情好鲫构,可當(dāng)我...
    茶點故事閱讀 67,500評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著玫坛,像睡著了一般结笨。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上湿镀,一...
    開封第一講書人閱讀 51,370評論 1 302
  • 那天炕吸,我揣著相機與錄音,去河邊找鬼肠骆。 笑死,一個胖子當(dāng)著我的面吹牛塞耕,可吹牛的內(nèi)容都是我干的蚀腿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,193評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼莉钙!你這毒婦竟也來了廓脆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,074評論 0 276
  • 序言:老撾萬榮一對情侶失蹤磁玉,失蹤者是張志新(化名)和其女友劉穎停忿,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蚊伞,經(jīng)...
    沈念sama閱讀 45,505評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡席赂,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,722評論 3 335
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了时迫。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片颅停。...
    茶點故事閱讀 39,841評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖掠拳,靈堂內(nèi)的尸體忽然破棺而出癞揉,到底是詐尸還是另有隱情,我是刑警寧澤溺欧,帶...
    沈念sama閱讀 35,569評論 5 345
  • 正文 年R本政府宣布喊熟,位于F島的核電站,受9級特大地震影響姐刁,放射性物質(zhì)發(fā)生泄漏芥牌。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,168評論 3 328
  • 文/蒙蒙 一龙填、第九天 我趴在偏房一處隱蔽的房頂上張望胳泉。 院中可真熱鬧,春花似錦岩遗、人聲如沸扇商。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,783評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽案铺。三九已至,卻和暖如春梆靖,著一層夾襖步出監(jiān)牢的瞬間控汉,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,918評論 1 269
  • 我被黑心中介騙來泰國打工返吻, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留姑子,地道東北人。 一個月前我還...
    沈念sama閱讀 47,962評論 2 370
  • 正文 我出身青樓测僵,卻偏偏與公主長得像街佑,于是被迫代替她去往敵國和親谢翎。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,781評論 2 354

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