摘要:初中生可能會(huì)操作次,耗時(shí)小時(shí)。高中生可能會(huì)把所有電腦連起來(lái),同時(shí)操控,只需要操作一次,耗時(shí)一個(gè)小時(shí)。注意該必須實(shí)現(xiàn)接口才能觸發(fā)回調(diào),否則會(huì)報(bào)錯(cuò)例類里方法里的。
v3.1更新
完善更多下拉刷新場(chǎng)景
增加【上拉分頁(yè)加載】和【無(wú)感分頁(yè)加載】
v3.0更新增加超強(qiáng)功能的下拉刷新
v2.0更新增加對(duì)團(tuán)隊(duì)開發(fā)的支持
增加對(duì)混合列表的支持
簡(jiǎn)介非約束列表,
也是很多同學(xué)口中的“萬(wàn)能適配器”,
不過(guò)我并不認(rèn)同“萬(wàn)能”的這個(gè)說(shuō)法,
誰(shuí)的適配器ListView和RecyclerView通用?
預(yù)覽一下效果先:
1、單列列表
2、多列列表
3、混合列表
顯然,
從界面上看不出什么名堂,
那就先說(shuō)下我的非約束列表有什么優(yōu)勢(shì)吧。
打個(gè)比方,
某中學(xué)要給10臺(tái)電腦升級(jí)程序,
平均一臺(tái)電腦操作一次需要一個(gè)小時(shí)。
初中生可能會(huì)操作10次,
耗時(shí)10小時(shí)。
高中生可能會(huì)把所有電腦連起來(lái),
同時(shí)操控,
只需要操作一次,
耗時(shí)一個(gè)小時(shí)。
我們用普通的Adapter的話,
就好比初中生,
每次修改一個(gè)條目,
就把所有使用這個(gè)條目的類全改一遍,
無(wú)論是Activity還是Adapter,
但是用了非約束列表就不一樣了,
邏輯基本上都在Bean里,
基本上只需要改itemLayout的樣式,
和Bean里的邏輯即可。
到這里,
可能有同學(xué)會(huì)疑惑,
為什么不管Adapter?
因?yàn)椋?br>我的項(xiàng)目只需要一個(gè)Adapter,
一個(gè)Adapter,
全場(chǎng)通用!
說(shuō)得細(xì)一點(diǎn),
就是我把邏輯全部拆散重組,
Adapter架空,
只負(fù)責(zé)Activity、ViewHolder、bean之間的連通。
我個(gè)人喜歡把View和與其相對(duì)應(yīng)的數(shù)據(jù)放一起,
所以我把ViewHolder和邏輯放到了Bean里,
通過(guò)一個(gè)接口來(lái)使兩者進(jìn)行結(jié)合,
哦不,
是將數(shù)據(jù)顯示到View上。
但是,
ViewHolder那么多,
Adapter怎么將其連通起來(lái)呢?
所以我寫了一個(gè)ViewHolderManager,
ViewHolderManager負(fù)責(zé)根據(jù)條目的類型,
找到相對(duì)應(yīng)的ViewHolder,
進(jìn)行實(shí)例化并返回給Adapter。
整體流程如下圖:
好了,
原理就說(shuō)到這里,
━━━━━━━━━━━━━━━這是清理內(nèi)存的分割線━━━━━━━━━━━━━━━
下面開始聊聊我的非約束列表的使用步驟:
一:
新建一個(gè)Bean類,
里邊寫個(gè)ViewHolder內(nèi)部類,
繼承ViewHolderManager.ViewHolder,
和普通的Adapter的內(nèi)部類差不多,
不過(guò)需要注意的是,
構(gòu)造里的參數(shù)不一樣:
/** * ViewHolder --> 主頁(yè)的按鈕 */ public static class MusicViewHolder extends ViewHolderManager.ViewHolder { public RelativeLayout rl_music; public TextView tv_song; public TextView tv_singer; public MusicViewHolder(ViewGroup viewGroup) { // 兩個(gè)參數(shù),第一個(gè)viewGroup不解釋,第二個(gè)即本ViewHolder對(duì)應(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)造里多了個(gè)參數(shù),
即該ViewHolder對(duì)應(yīng)的LayoutXml.
二:
進(jìn)入ViewHolderManager,
對(duì)應(yīng)你新寫的ViewHolder,
增加一個(gè)公開靜態(tài)常量,
只要不與其他的值重復(fù)即可,
并put到itemMap里,
key為你剛寫的常量,
value為剛寫的ViewHolder的class。
/** * 條目類型 --> …… */ public static final int //…… /** * 條目類型 --> 新聞卡片 */ public static final int ITEM_TYPE_NEWS = 8; /** * 條目類型 --> 音樂(lè) */ public static final int ITEM_TYPE_MUSIC = 9; /** * 加載條目類型,以及對(duì)應(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里定義的那個(gè)常量,
@Override protected void initItemType() { setItemType(ViewHolderManager.ITEM_TYPE_MUSIC); }
在initBindView()里,
把普通Adapter里onBindViewHolder()的代碼挪過(guò)來(lái)。
@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實(shí)現(xiàn)FreedomCallback接口,
并在onClickCallback里編寫代碼,
然后回到Bean里調(diào)用getCallback(activity).onClickCallback();
vh.rl_music.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // 點(diǎn)擊事件 // 如果不需要和Activity進(jìn)行交互, // 那么直接在這里寫點(diǎn)擊事件即可 // // 如果需要和Activity進(jìn)行交互, // 那么Activity實(shí)現(xiàn)FreedomCallback接口, // 并在onClickCallback里編寫代碼, // 即可觸發(fā)回調(diào), // 以和Activity進(jìn)行交互。 // // 注意: // 該Activity必須實(shí)現(xiàn)FreedomCallback接口才能觸發(fā)回調(diào), // 否則會(huì)報(bào)錯(cuò) getCallback(activity).onClickCallback(v, position, vh); } });
例:
類BeanMusic里initBindView方法里的vh.rl_music.setOnClickListener()。
好了,
Bean就完成了,
Activity里使用它的方式和普通的沒(méi)什么差別,
只是聲明數(shù)據(jù)源mList的時(shí)候,
類型為Object或者不要加類型就好:
/** * 數(shù)據(jù)源 */ private List mList;
然后就可以使用FreedomAdapter了:
// 實(shí)例化RecyclerView mAdapter = new FreedomAdapter(this, mList); recycler.setLayoutManager(new LinearLayoutManager(this)); recycler.setItemAnimator(new DefaultItemAnimator()); recycler.setAdapter(mAdapter);
使用起來(lái)雖然沒(méi)有比普通的簡(jiǎn)單太多,
但也功能要比普通的強(qiáng)大太多啊不是么?
代碼很簡(jiǎn)單,
注釋我也寫得很全,
如果還是有疑問(wèn)的地方,
歡迎在文章下評(píng)論,
或者加入QQ討論群:569614530,
群里找我,
我是塵少。
本文github鏈接:
https://github.com/Bamboy1203...
也可以先下載apk安裝體驗(yàn):
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/74175.html
摘要:萬(wàn)能適配器下拉刷新無(wú)感分頁(yè)更新完善更多下拉刷新場(chǎng)景增加上拉分頁(yè)加載和無(wú)感分頁(yè)加載更新增加超強(qiáng)功能的下拉刷新更新增加對(duì)團(tuán)隊(duì)開發(fā)的支持增加對(duì)混合列表的支持簡(jiǎn)介非約束列表,也是很多同學(xué)口中的萬(wàn)能適配器,近期增加了下拉刷新和無(wú)感分頁(yè)。 萬(wàn)能適配器 + 下拉刷新 + 無(wú)感分頁(yè) v3.1更新 完善更多下拉刷新場(chǎng)景 增加【上拉分頁(yè)加載】和【無(wú)感分頁(yè)加載】 v3.0更新 增加超強(qiáng)功能的下拉刷新 v...
摘要:右滑關(guān)閉簡(jiǎn)介很多中都會(huì)有右滑關(guān)閉功能,尤其是在全面屏?xí)r代更顯得尤為重要,但是,禁止非全屏的使用透明主題,否則會(huì)引發(fā)這導(dǎo)致了體驗(yàn)最優(yōu)的右滑關(guān)閉方案則不能再使用,除非有微信那種黑科技。 SlidingShut 右滑關(guān)閉 簡(jiǎn)介 很多APP中都會(huì)有右滑關(guān)閉功能, 尤其是在全面屏?xí)r代更顯得尤為重要, 但是, Android 8.0禁止非全屏的Activity使用透明主題, 否則會(huì)引發(fā):...
閱讀 3461·2019-08-30 15:55
閱讀 2058·2019-08-30 15:44
閱讀 1464·2019-08-30 12:47
閱讀 752·2019-08-30 11:05
閱讀 1637·2019-08-30 10:54
閱讀 663·2019-08-29 16:07
閱讀 3575·2019-08-29 14:17
閱讀 2234·2019-08-23 18:31