一 瞎扯淡
項(xiàng)目中經(jīng)常性會(huì)碰到列表的單選描沟、多選飒泻,實(shí)現(xiàn)起來(lái)好像也不難,但是最近項(xiàng)目有好多個(gè)需要單選/多選的頁(yè)面吏廉,看到設(shè)計(jì)稿的一瞬間泞遗,腦子靈光一閃,為啥不把這些簡(jiǎn)單而又繁瑣的邏輯給封裝起來(lái)呢(懶癌發(fā)作)迟蜜?
于是就有了下面的小東西(開(kāi)源庫(kù))...
二 功能
1.功能
- 普通單選
- 普通多選
- 預(yù)選中
- 攔截器
- ...
3.優(yōu)點(diǎn)
- 簡(jiǎn)單易用
- 低耦合
- 不用為Bean添加額外字段
- 沒(méi)有調(diào)用
Adapter.notifyItemChange
方法刹孔,所以不會(huì)有閃屏Bug
三 使用
1.配置
[圖片上傳失敗...(image-c19eda-1552441902508)]
Step 1. 在你項(xiàng)目的 Project (根目錄)的 build.gradle 文件添加下面配置:
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
Step 2. 在需要使用的模塊下添加以下依賴(lài)
dependencies {
//Tag更換成最新的版本號(hào),比如 1.1
implementation 'com.github.gminibird:CheckHelper:Tag'
}
依賴(lài)包中依賴(lài)了RecyclerView
娜睛,如果項(xiàng)目中已經(jīng)使用了不同版本髓霞,可以使用以下配置:
dependencies {
//Tag更換成最新的版本號(hào),比如 1.1
implementation 'com.github.gminibird:CheckHelper:Tag',{
exclude group: 'com.android.support'
}
}
最后那個(gè)1.0是版本號(hào)畦戒,可以上 GitHub 上看最新的方库,然后就可以愉快的玩耍啦。
2.使用
- 創(chuàng)建CheckHelper實(shí)例
SingleCheckHelper mCheckHelper = new SingleCheckHelper(); //or MultiCheckHelper mCheckHelper = new MultiCheckHelper();
- 注冊(cè)選擇器
mCheckHelper.register(String.class, new CheckHelper.Checker<String, LwViewHolder>() @Override public void check(String s, LwViewHolder holder) { //選中狀態(tài) holder.itemView.setBackgroundColor(0xFF73E0E4); //藍(lán)色 holder.setChecked(R.id.checkbox, true); } @Override public void unCheck(String s, LwViewHolder holder) { //非選中狀態(tài) holder.itemView.setBackgroundColor(0xFFFFFFFF); //白色 holder.setChecked(R.id.checkbox, false); } });
- 綁定到Adapter中
@Override protected void onBind(@NonNull LwViewHolder holder, @NonNull String item) { //這里用了自己封裝的Adapter障斋,相當(dāng)于onBindViewHolder方法 mCheckHelper.bind(item, holder, holder.itemView); }
然后纵潦,然后就完成了。垃环。邀层。運(yùn)行就可以看到想要的效果,選中的數(shù)據(jù)可以調(diào)用相應(yīng)CheckHelper
實(shí)例的getXXX()
獲取遂庄。
四 效果
廢話(huà)少說(shuō)寥院,先上圖:
1.左到右分別為 單選->多選->攔截器
<center>
<img src="https://user-gold-cdn.xitu.io/2019/1/27/1688e64e15aa79dc?w=374&h=607&f=gif&s=1047346" width ="240">
<img src="https://user-gold-cdn.xitu.io/2019/1/27/1688e65eea8cb4ed?w=374&h=607&f=gif&s=1119303"
width ="240">
<img src="https://user-gold-cdn.xitu.io/2019/2/25/169235cacfe71475?w=368&h=598&f=gif&s=1349327"
width ="240">
</center>
五 Api
1. CheckHelper (基類(lèi))
返回值 | 方法 | 說(shuō)明 |
---|---|---|
void | register(Class, Checker) | 注冊(cè)Checker,提供選中以及非選中狀態(tài) |
void | bind(Object, ViewHolder) | 綁定涛目,沒(méi)有指定點(diǎn)擊View秸谢,需要額外設(shè)置點(diǎn)擊事件凛澎,并主動(dòng)調(diào)用select()方法 |
void | bind(Object,ViewHolder, @IdRes int) | 綁定,并指定觸發(fā)事件的 View id |
void | bind(Object,ViewHolder, View) | 綁定估蹄,并指定觸發(fā)事件的 View |
void | bind(Object, ViewHolder, boolean) | 手動(dòng)綁定 |
void | select(Object, ViewHolder) | 手動(dòng)選擇(狀態(tài)值非當(dāng)前狀態(tài)的相反值) |
void | select(Object, ViewHolder, boolean) | 手動(dòng)選擇(可設(shè)置狀態(tài)) |
void | addOnCheckListener(Class,OnCheckListene) | 添加check監(jiān)聽(tīng)(觸發(fā)條件為bind監(jiān)聽(tīng)與select監(jiān)聽(tīng)的并集) |
void | addOnSelectListener(Class,OnSelectListener) | 添加select監(jiān)聽(tīng)(點(diǎn)擊時(shí)調(diào)用) |
void | addOnBindListener(Class,onBindListener) | 添加bind監(jiān)聽(tīng)(onBindViewHolder調(diào)用時(shí)調(diào)用) |
void | addInterceptor(Interceptor interceptor) | 添加攔截器 |
boolean | isChecked(Object,ViewHolder) | 判斷當(dāng)前實(shí)例是否選中 |
boolean | hasChecked() | 判斷是否至少選中一個(gè) |
void | add(Object) | 添加默認(rèn)選中 |
void | remove(Object) | 刪除選中 |
T | getChecked() | 獲取所有選中 |
2. SingleCheckHelper(單選)
返回值 | 方法 | 說(shuō)明 |
---|---|---|
void | setCanCancel(booleanl) | 設(shè)置是否可以取消 |
3. MultiCheckHelper(多選)
返回值 | 方法 | 說(shuō)明 |
---|---|---|
Set<T> | getChecked(Class<T>) | 獲取指定類(lèi)型的所有選中 |
boolean | isAllChecked(List<?>) | 指定列表是否全部選中 |
boolean | isAllChecked(List<?>, Class<T>) | 指定列表里面的指定類(lèi)型是否全部選中 |
void | checkAll(Map<?,ViewHolder>) | 選擇全部(指定數(shù)據(jù)) |
void | checkAll(List<?>, Adapter) | 選擇全部(指定數(shù)據(jù)) |
void | unCheckAll(Adapter adapter) | 取消全部選中 |
void | unCheckAll(Adapter adapter, Class<T>, List<T>) | 取消全部選中(指定數(shù)據(jù)) |
void | unCheckAll(Adapter, Class) | 取消全部選中(指定數(shù)據(jù)塑煎,指定類(lèi)型) |
written by gminibird
源碼戳上面 ^^^