MultiType-Adapter 優(yōu)雅的實(shí)現(xiàn)RecyclerVIew中的復(fù)雜布局

MultiType-Adapter

一款輕量級(jí)支持多數(shù)據(jù)類型的 RecyclerView 適配器; 使用簡(jiǎn)單傲隶,完全解耦;
這么說吧:通訊聊天界面漩蟆、朋友圈布局声滥、淘寶 UI等復(fù)雜頁(yè)面 優(yōu)雅快速實(shí)現(xiàn)卧蜓,無論你是一種數(shù)據(jù)有多種VIew類型,還是多種數(shù)據(jù)多種類型帐要,還是兩者都有,統(tǒng)統(tǒng)幫你快速地弥奸、優(yōu)雅地搞定榨惠!
代碼傳送門

·總覽
·特性
  · 基礎(chǔ)用法
  · 單數(shù)據(jù)
  · 多數(shù)據(jù)-多類型
  · 單類型-多數(shù)據(jù)
  · 事件
·高級(jí)用法
  · 網(wǎng)格布局與線性布局混合編排
  · 瀑布流布局
  · 上拉加載
  · 無數(shù)據(jù)時(shí)過度界面設(shè)置
  · 混合布局拖拽實(shí)現(xiàn)
  · 懸浮吸頂效果
  · 設(shè)置復(fù)用數(shù)量
·擴(kuò)展
·Thrank
`一些說明

總覽

總體來講支持以下效果

總覽

特性

· 輕盈、整個(gè)類庫(kù)只有9個(gè)文件
  · 全面、支持 bean type 之間 一對(duì)一 和 一對(duì)多 的關(guān)系綁定
  · 職責(zé)單一赠橙、只負(fù)責(zé)本分工作伸蚯,專注多類型的列表視圖 類型分發(fā),不會(huì)影響 view 的內(nèi)容或行為
  · 內(nèi)存简烤、沒有性能損失剂邮,內(nèi)存友好
  · 可讀、代碼清晰干凈

基礎(chǔ)用法

// root build.gradle
repositories {
    jcenter()
    maven { url "https://www.jitpack.io" }
}
// yout project build.gradle
dependencies {
        compile 'com.github.LidongWen:MultiTypeAdapter:0.2.6'
}

單數(shù)據(jù)

CommonAdapter adapter = new CommonAdapter<ItemClass>(this, ItemClass.class, R.layout.item_one) {
    @Override
    protected void convert(ViewHolder holder, final ItemClass item, int position) {
        holder.setText(R.id.tv_item01, item.name);
    }
};
....
recyclerView.setAdapter(adapter);

示例查看:single example

多數(shù)據(jù)-多類型

一個(gè)數(shù)據(jù)類型對(duì)應(yīng)一種viewType

創(chuàng)建一個(gè)或多個(gè) class 繼承MultiItemView横侦,這邊做某一種數(shù)據(jù)類型 對(duì)應(yīng)的 ItemView的創(chuàng)建挥萌,與數(shù)據(jù)裝配

public class ItemVIew01 extends MultiItemView<Bean01> {
    @NonNull
    @Override
    public int getLayoutId() {
        return R.layout.item_one;
    }
    @Override
    public void onBindViewHolder(@NonNull ViewHolder holder, @NonNull Bean01 item, int position) {
        holder.setText(R.id.tv_item01,item.title);
    }
}
public class Item ...

創(chuàng)建一個(gè) 適配器MultiTypeAdapter ,注冊(cè) beanMultiItemView 將適配器設(shè)入RecyclerView;

private MultiTypeAdapter adapter = new MultiTypeAdapter();
adapter.register(Bean01.class, new ItemVIew01());
adapter.register(Bean02.class, new ItemVIew02());
adapter.register(Bean03.class, new ItemVIew03());
...
adapter.setItems(items);
recyclerView.setAdapter(adapter);

示例查看:many2many Example

單數(shù)據(jù)-多類型

一種數(shù)據(jù)類型可以有多種ViewType

創(chuàng)建一個(gè)或多個(gè) class 繼承MultiItemView枉侧,其中 他們的數(shù)據(jù)類型要一致引瀑,重寫 isForViewType方法

public class ItemVIew04 extends MultiItemView<Bean04> {
        ...
    @Override
    public boolean isForViewType(Bean04 item, int postion) {
        if (Bean04.TYPE_ONE.equals(item.type)) {
            return true;
        }
        return false;
    }
}

public class ItemVIew05 extends MultiItemView<Bean04> {
        ...
    @Override
    public boolean isForViewType(Bean04 item, int postion) {
        if (Bean04.TYPE_TWO.equals(item.type)) {
            return true;
        }
        return false;
    }
}

創(chuàng)建一個(gè)入口 class 繼承MultiItemView , 構(gòu)造函數(shù)時(shí)調(diào)用 addChildeItemView方法

public class ItemVIew06 extends MultiItemView<Bean04> {
    public ItemVIew06() {
        super();
        addChildeItemView(new ItemVIew04());
        addChildeItemView(new ItemVIew05());
        addChildeItemView(new ItemVIew07());
    }
}

activity

       adapter = new MultiTypeAdapter();
       adapter.register(Bean04.class, new ItemVIew06());
       ...

示例查看:one-many Example

事件

設(shè)置點(diǎn)擊事件于長(zhǎng)按事件

       adapter.setOnItemClickListener(new OnItemClickListener<ItemClass>() {
            @Override
            public void onItemClick(View view, RecyclerView.ViewHolder holder, ItemClass itemClass, int position) {
            }

            @Override
            public boolean onItemLongClick(View view, RecyclerView.ViewHolder holder, ItemClass itemClass, int position) {
                return false;
            }
        });

高級(jí)用法

網(wǎng)格布局與線性布局混合編排

根據(jù)數(shù)據(jù)類型設(shè)置 view 比重

    adapter.register(String.class, new ItemVIewNormal()); // 一對(duì)一
    adapter.register(Bean01.class, new ItemVIew01());
    adapter.register(Bean02.class, new ItemVIew02());
    adapter.register(Bean03.class, new ItemVIew03());
    adapter.register(Bean04.class, new ItemVIew06());   // 一對(duì)多

         final GridLayoutManager layoutManager = new GridLayoutManager(this, SPAN_COUNT);
        GridLayoutManager.SpanSizeLookup spanSizeLookup = new GridLayoutManager.SpanSizeLookup() {
            @Override
            public int getSpanSize(int position) {
                Object item = items.get(position);
                if (item instanceof Bean01) {
                    return 1;
                }
                if (item instanceof Bean02) {
                    return 2;
                }
                if (item instanceof Bean03) {
                    return SPAN_COUNT;
                }
                if (item instanceof Bean04 ) {
                    return SPAN_COUNT;
                }
                if (item instanceof String) {
                    return SPAN_COUNT;
                }
                return 2;
            }
        };

示例查看:mix Example

瀑布流布局

示例查看:WaterFall Example

上拉加載

效果如下

loading.gif

將我們的 初始化LoadMoreWrapper2,添加上拉UI

    LoadMoreWrapper2 loadMoreWrapper2;
    private MultiTypeAdapter adapter;
    
    loadMoreWrapper2 = new LoadMoreWrapper2(adapter);
    loadMoreWrapper2.setLoadMoreView(LayoutInflater.from(this).inflate(R.layout.default_loading, recyclerView, false));
    recyclerView.setAdapter(loadMoreWrapper2);
    
    loadMoreWrapper2.setOnLoadMoreListener(new LoadMoreWrapper2.OnLoadMoreListener() {
        @Override
        public void onLoadMoreRequested() {
            loadMoreWrapper2.loadingComplete();//加載完畢
        }
    });
    
    // loadMoreWrapper2.setLoadMore(false); 開啟或關(guān)閉加載功能

示例查看:pull-load Example

無數(shù)據(jù)時(shí)過度界面設(shè)置

    EmptyWrapper emptyWrapper;
    private MultiTypeAdapter adapter;
    
    emptyWrapper = new EmptyWrapper(adapter);
    emptyWrapper.setEmptyView(R.layout.layout_empty);
    recyclerView.setAdapter(emptyWrapper);

示例查看:Empty Example

混合布局拖拽實(shí)現(xiàn)

混合布局拖拽實(shí)現(xiàn)

吸頂效果

快速打造RecyclerView懸浮吸頂效果
一共有四種模式 請(qǐng)具體查看文章

sticky.gif

設(shè)置復(fù)用數(shù)量

業(yè)務(wù)需要,設(shè)置每種view的最大復(fù)用數(shù)量

public class ItemVIew01 extends MultiItemView<Bean01> {

    public void getMaxRecycleCount(){
        return 5;
    }
}

擴(kuò)展

SasukeRecyclerView:基于MultiType-Adapter開發(fā)的一框下拉刷新上拉加載的庫(kù)

Thrank

  • 鴻洋: 空白頁(yè)功能與上拉加載功能 我拿過來稍微做了修改
  • Glide: 圖片加載
  • drakeet學(xué)習(xí)其中的思想

一些說明

大家可能咋一看榨馁,會(huì)認(rèn)為我抄襲 drakeet的代碼憨栽,我雖然有學(xué)習(xí)過他的代碼,其中也讓我受益良多翼虫,不論是技術(shù)點(diǎn)還是架構(gòu)松耦合方面的知識(shí)屑柔,但是,這份開源庫(kù)雖然使用上與之相似珍剑,但完全手寫掸宛,不存在抄襲 drakeet , 而且 是否抄襲 請(qǐng)大家閱讀完源碼之后再做評(píng)論,謝謝招拙。

V 0.2.6  ·增加黏貼布局類型
V 0.2.5  ·GroupWrapper支持放入其他包中
V 0.2.0  ·分組伸展收縮功能
V 0.1.4
 ·懸浮吸頂效果增強(qiáng):可隨意搭配itemVIew為懸浮布局
 ·事件處理優(yōu)化
V 0.1.3
 ·檢測(cè)并修復(fù)切換懸浮頭部狀態(tài)時(shí)發(fā)生內(nèi)存泄漏唧瘾;

檢測(cè)內(nèi)存泄漏-內(nèi)存占用圖

V 0.1.2
 ·支持懸浮頭部觸摸事件,點(diǎn)擊事件别凤,長(zhǎng)按事件等
 ·multiTypeAdapter支持restful風(fēng)格調(diào)用
V 0.1.1
 ·MultiItemView 改變饰序,更加簡(jiǎn)潔、直觀
 ·新增 懸浮吸頂頭部功能 快速打造Recyclerview懸浮吸頂頭部


V 0.1.1
 ·支持頭部吸頂功能
V 0.0.1
 ·實(shí)現(xiàn)一對(duì)一關(guān)系功能
 ·實(shí)現(xiàn)一對(duì)多關(guān)系功能
 ·事件監(jiān)聽
 ·支持網(wǎng)格规哪、瀑布流求豫、線性布局
 ·上拉加載功能
 ·數(shù)據(jù)為空時(shí)過渡界面展示功能

代碼傳送門:戳我!!!

來上一張架構(gòu)圖


multiTypeAdapter

希望我的文章不會(huì)誤導(dǎo)在觀看的你,如果有異議的地方歡迎討論和指正由缆。
如果能給觀看的你帶來收獲注祖,那就是最好不過了。

人生得意須盡歡, 桃花塢里桃花庵
點(diǎn)個(gè)關(guān)注唄均唉,對(duì)是晨,不信你點(diǎn)試試?
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末舔箭,一起剝皮案震驚了整個(gè)濱河市罩缴,隨后出現(xiàn)的幾起案子蚊逢,更是在濱河造成了極大的恐慌,老刑警劉巖箫章,帶你破解...
    沈念sama閱讀 216,324評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件烙荷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡檬寂,警方通過查閱死者的電腦和手機(jī)终抽,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,356評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來桶至,“玉大人昼伴,你說我怎么就攤上這事×鸵伲” “怎么了圃郊?”我有些...
    開封第一講書人閱讀 162,328評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)女蜈。 經(jīng)常有香客問我持舆,道長(zhǎng),這世上最難降的妖魔是什么伪窖? 我笑而不...
    開封第一講書人閱讀 58,147評(píng)論 1 292
  • 正文 為了忘掉前任逸寓,我火速辦了婚禮,結(jié)果婚禮上惰许,老公的妹妹穿的比我還像新娘席覆。我一直安慰自己,他們只是感情好汹买,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,160評(píng)論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著聊倔,像睡著了一般晦毙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耙蔑,一...
    開封第一講書人閱讀 51,115評(píng)論 1 296
  • 那天见妒,我揣著相機(jī)與錄音,去河邊找鬼甸陌。 笑死须揣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钱豁。 我是一名探鬼主播耻卡,決...
    沈念sama閱讀 40,025評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼牲尺!你這毒婦竟也來了卵酪?” 一聲冷哼從身側(cè)響起幌蚊,我...
    開封第一講書人閱讀 38,867評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎溃卡,沒想到半個(gè)月后溢豆,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,307評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡瘸羡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,528評(píng)論 2 332
  • 正文 我和宋清朗相戀三年漩仙,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片犹赖。...
    茶點(diǎn)故事閱讀 39,688評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡队他,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出冷尉,到底是詐尸還是另有隱情漱挎,我是刑警寧澤,帶...
    沈念sama閱讀 35,409評(píng)論 5 343
  • 正文 年R本政府宣布雀哨,位于F島的核電站磕谅,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏雾棺。R本人自食惡果不足惜膊夹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,001評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望捌浩。 院中可真熱鬧放刨,春花似錦、人聲如沸尸饺。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,657評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)浪听。三九已至螟碎,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間迹栓,已是汗流浹背掉分。 一陣腳步聲響...
    開封第一講書人閱讀 32,811評(píng)論 1 268
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留克伊,地道東北人酥郭。 一個(gè)月前我還...
    沈念sama閱讀 47,685評(píng)論 2 368
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像愿吹,于是被迫代替她去往敵國(guó)和親不从。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,573評(píng)論 2 353

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