效果
展示在手機(jī)上效果:
服務(wù)器返回的數(shù)據(jù):
思路
思路一:
固定寫(xiě)死在xml中马澈,然后根據(jù)相對(duì)應(yīng)的去賦值痊班,但是,這樣耗時(shí)并且不夠靈活馒胆,如果當(dāng)前json一旦改變那么凝果,需要在操作,果斷放棄型雳、
思路二:
ReyclerView多套布局實(shí)現(xiàn)。針對(duì)于這樣json沿量,需要人為干預(yù)一下服務(wù)器返回的數(shù)據(jù)源冤荆,通過(guò)for循環(huán)遍歷匙赞,在每一個(gè)photoGroupID改變之前,
添加新的數(shù)據(jù)源芥被,以此當(dāng)做第二套布局等等等來(lái)完成坐榆,不是此處重點(diǎn)、
思路三:
借助BRVAH框架中對(duì)于Section分組布局來(lái)完成
分析
正常使用RecyclerView考慮一下幾點(diǎn):
(1) item條目布局樣式
(2) 實(shí)體類匹中、
(3)適配器豪诲、
(4)數(shù)據(jù)源樣式屎篱、
(1)item條目布局樣式
該項(xiàng)比較簡(jiǎn)單,根據(jù)效果圖重虑,不難看出應(yīng)該準(zhǔn)備兩套布局秦士、
第一套(分組布局頭):
第二套(分布布局內(nèi)容):
比較簡(jiǎn)單隧土,寫(xiě)xml就ok 了
(2)實(shí)體類
一般的RecyclerView需求中次洼,建立一個(gè)bean:
public class PhotoItemBean{
private int PhotoGroupID;
private String PhotoGroupName;
private int PhotoID;
private String PhotoName;
private String ImgUrl;
...set/get方法這里忽略了...
}
但是需要添加進(jìn)行加一層處理,可以理解為添加一層包裝:
public class ZXPTongGuoXiangXiBean extends SectionEntity<ZXPTongGuoXiangXiSecondInfo.PhotoItemsBean> {
public ZXPTongGuoXiangXiBean(boolean isHeader, String header) {
super(isHeader, header);
}
public ZXPTongGuoXiangXiBean(ZXPTongGuoXiangXiSecondInfo.PhotoItemsBean photoItemsBean) {
super(photoItemsBean);
}
}
自定義一個(gè)類,必須繼承SectionEntity<正常adapter中用到的實(shí)體類>
可以看出提供了兩個(gè)構(gòu)造方法亥啦。一個(gè)是表明是header(包含header的名字),一個(gè)是正常的內(nèi)容
(4)適配器樣式
這里的適配器也替換成如下樣式:
public class ZXPTongGuoXiangXiAdapter extends BaseSectionQuickAdapter<ZXPTongGuoXiangXiBean, BaseViewHolder> {
/**
* Same as QuickAdapter#QuickAdapter(Context,int) but with
* some initialization data.
*
* @param layoutResId The layout resource id of each item.
* @param sectionHeadResId The section head layout id for each item
* @param data A new list is created out of this one to avoid mutable list
*/
public ZXPTongGuoXiangXiAdapter(int layoutResId, int sectionHeadResId, List<ZXPTongGuoXiangXiBean> data) {
super(layoutResId, sectionHeadResId, data);
}
@Override
protected void convertHead(BaseViewHolder helper, ZXPTongGuoXiangXiBean item) {
helper.setText(R.id.textView_ZXPG_XiangXi_TongGuo_Header, item.header);
}
@Override
protected void convert(BaseViewHolder helper, ZXPTongGuoXiangXiBean item) {
ZXPTongGuoXiangXiSecondInfo.PhotoItemsBean listbean = item.t;
//省略其他操作,就是配置數(shù)據(jù)的操作
}
}
可以發(fā)現(xiàn)错妖,需要繼承BaseSectionQuickAdapter適配器疚沐,其中第一個(gè)范型就是重新自定義的類
構(gòu)造函數(shù)也需要傳遞:第一個(gè)是內(nèi)容的layout,第二個(gè)傳遞的是頭布局
然后也有兩個(gè)處理的方法,針對(duì)于頭布局以及內(nèi)容區(qū)域痴施,分別是convertHead與convert的回調(diào)究流。
(5)數(shù)據(jù)源
通過(guò)上述適配器也可以發(fā)現(xiàn)芬探,需要List<ZXPTongGuoXiangXiBean>,但是哩簿,ZXPTongGuoXiangXiBean是自己自定義的一個(gè)類(其繼承了SectionEntity)炎疆,正常網(wǎng)絡(luò)返回的就是文章開(kāi)頭的數(shù)據(jù)結(jié)構(gòu),我建立了PhotoItemsBean全跨,所以這里就需要針對(duì)于json轉(zhuǎn)換成的bean進(jìn)行轉(zhuǎn)換亿遂。一般是寫(xiě)一個(gè)for循環(huán)蛇数。比如我這里就是根據(jù):
for (i in zxpTongGuoXiangXiSecondInfo?.photoItems!!.indices) {
if (lin_code != zxpTongGuoXiangXiSecondInfo!!.photoItems.get(i).photoGroupID) {
lin_code = zxpTongGuoXiangXiSecondInfo!!.photoItems.get(i).photoGroupID
//往數(shù)據(jù)集合中添加
mList.add(ZXPTongGuoXiangXiBean(true, zxpTongGuoXiangXiSecondInfo?.photoItems?.get(i)?.photoGroupName))
}
mList.add(ZXPTongGuoXiangXiBean(zxpTongGuoXiangXiSecondInfo?.photoItems?.get(i)))
}
遍歷數(shù)據(jù)源耳舅,根據(jù)photGourpID進(jìn)行區(qū)分倚评,如果當(dāng)前的photoGroupID是新的那么就是新的一組馏予,在當(dāng)前位置插入(mList中)一個(gè)頭布局,但是由于在for循環(huán)下呢岗,數(shù)據(jù)源中的數(shù)據(jù)也要繼續(xù)添加蛹尝,否則會(huì)少的。
具體的需要看服務(wù)器返回來(lái)的數(shù)據(jù)進(jìn)行處理挫酿,簡(jiǎn)單講就是在合適的地方插入頭布局饭豹,以此達(dá)到分組的效果务漩、
總結(jié)
該種模式針對(duì)于Section樣式比較簡(jiǎn)單快捷。