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è) bean
與 MultiItemView
將適配器設(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
上拉加載
效果如下
將我們的 初始化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)
吸頂效果
快速打造RecyclerView懸浮吸頂效果
一共有四種模式 請(qǐng)具體查看文章
設(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
一些說明
大家可能咋一看榨馁,會(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)存泄漏唧瘾;
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)圖
希望我的文章不會(huì)誤導(dǎo)在觀看的你,如果有異議的地方歡迎討論和指正由缆。
如果能給觀看的你帶來收獲注祖,那就是最好不過了。