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