你還在爲列表[單選]、[多選]寫重複的邏輯嗎android
項目中常常性會碰到列表的單選、多選,實現起來好像也不難,可是最近項目有好多個須要單選/多選的頁面,看到設計稿的一瞬間,腦子靈光一閃,爲啥不把這些簡單而又繁瑣的邏輯給封裝起來呢(懶癌發做)?git
因而就有了下面的小東西(開源庫)...github
Adapter.notifyItemChange
方法,因此不會有閃屏Bugallprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
複製代碼
Step 2. 在須要使用的模塊下添加如下依賴bash
dependencies {
//Tag更換成最新的版本號,好比 1.1
implementation 'com.github.gminibird:CheckHelper:Tag'
}
複製代碼
依賴包中依賴了RecyclerView
,若是項目中已經使用了不一樣版本,可使用如下配置:app
dependencies {
//Tag更換成最新的版本號,好比 1.1
implementation 'com.github.gminibird:CheckHelper:Tag',{
exclude group: 'com.android.support'
}
}
複製代碼
最後那個1.0是版本號,能夠上 GitHub 上看最新的,而後就能夠愉快的玩耍啦。maven
SingleCheckHelper mCheckHelper = new SingleCheckHelper();
//or
MultiCheckHelper mCheckHelper = new MultiCheckHelper();
複製代碼
mCheckHelper.register(String.class, new CheckHelper.Checker<String, LwViewHolder>()
@Override
public void check(String s, LwViewHolder holder) {
//選中狀態
holder.itemView.setBackgroundColor(0xFF73E0E4); //藍色
holder.setChecked(R.id.checkbox, true);
}
@Override
public void unCheck(String s, LwViewHolder holder) {
//非選中狀態
holder.itemView.setBackgroundColor(0xFFFFFFFF); //白色
holder.setChecked(R.id.checkbox, false);
}
});
複製代碼
@Override
protected void onBind(@NonNull LwViewHolder holder, @NonNull String item) {
//這裏用了本身封裝的Adapter,至關於onBindViewHolder方法
mCheckHelper.bind(item, holder, holder.itemView);
}
複製代碼
而後,而後就完成了。。。運行就能夠看到想要的效果,選中的數據能夠調用相應CheckHelper
實例的getXXX()
獲取。ide
廢話少說,先上圖:post
返回值 | 方法 | 說明 |
---|---|---|
void | register(Class, Checker) | 註冊Checker,提供選中以及非選中狀態 |
void | bind(Object, ViewHolder) | 綁定,沒有指定點擊View,須要額外設置點擊事件,並主動調用select()方法 |
void | bind(Object,ViewHolder, @IdRes int) | 綁定,並指定觸發事件的 View id |
void | bind(Object,ViewHolder, View) | 綁定,並指定觸發事件的 View |
void | bind(Object, ViewHolder, boolean) | 手動綁定 |
void | select(Object, ViewHolder) | 手動選擇(狀態值非當前狀態的相反值) |
void | select(Object, ViewHolder, boolean) | 手動選擇(可設置狀態) |
void | addOnCheckListener(Class,OnCheckListene) | 添加check監聽(觸發條件爲bind監聽與select監聽的並集) |
void | addOnSelectListener(Class,OnSelectListener) | 添加select監聽(點擊時調用) |
void | addOnBindListener(Class,onBindListener) | 添加bind監聽(onBindViewHolder調用時調用) |
void | addInterceptor(Interceptor interceptor) | 添加攔截器 |
boolean | isChecked(Object,ViewHolder) | 判斷當前實例是否選中 |
boolean | hasChecked() | 判斷是否至少選中一個 |
void | add(Object) | 添加默認選中 |
void | remove(Object) | 刪除選中 |
T | getChecked() | 獲取全部選中 |
返回值 | 方法 | 說明 |
---|---|---|
void | setCanCancel(booleanl) | 設置是否能夠取消 |
返回值 | 方法 | 說明 |
---|---|---|
Set | getChecked(Class) | 獲取指定類型的全部選中 |
boolean | isAllChecked(List<?>) | 指定列表是否所有選中 |
boolean | isAllChecked(List<?>, Class) | 指定列表裏面的指定類型是否所有選中 |
void | checkAll(Map<?,ViewHolder>) | 選擇所有(指定數據) |
void | checkAll(List<?>, Adapter) | 選擇所有(指定數據) |
void | unCheckAll(Adapter adapter) | 取消所有選中 |
void | unCheckAll(Adapter adapter, Class, List) | 取消所有選中(指定數據) |
void | unCheckAll(Adapter, Class) | 取消所有選中(指定數據,指定類型) |
written by gminibirdgradle
源碼戳上面 ^^^ui
- 曾榮基:廣州蘆葦科技 APP 團隊 Android 開發工程師
- 咱們正在招募小夥伴,有興趣的小夥伴能夠把簡歷發到 app@talkmoney.cn,備註:來自掘金社區
- 詳情能夠戳這裏--> 廣州蘆葦信息科技