RecyclerView實現ChoiceMode

RecyclerView 已經出來很久了.由于是Google推崇的新列表控件,所以開發者重心漸漸偏移到這個上面.可是在對比ListView的情況下,發現還是很多ListView原有比較好用的API在RecyclerView中沒有提供,比如addHeaderView,addFooterView,setEmptyView等等.

于是為了開發便利,不少大神寫了很好的開源庫,比如Hongyang的baseAdapter,CymChad的BaseRecyclerViewAdapterHelper.其中前者在處理header,footer,loading布局的時候是采用裝飾著模式,在適配器外面包裹了一層,這樣處理不會影響原來原來適配器的位置.后者是將這些布局作為條目布局來寫.

然后在開發中,經常遇到有checkable條目的需求.ListView中有setChoiceMode這樣好用的API,RecyclerView卻沒有.于是受以上提及庫的啟發,開發了此庫.


一個通用的RecyclerView的Adapter basic-adapter,主要支持:

  • 添加頭,尾布局
  • 預加載更多
  • 支持單、多選條目(同ListView的ChoiceMode)
  • 支持空數據布局
  • Builder mode 鏈式初始化配置
  • 添加條目點擊事件(普通條目,不包括頭尾)

下載

通過 Maven:

<dependency>
  <groupId>com.lhalcyon</groupId>
  <artifactId>basic-adapter</artifactId>
  <version>1.0.1</version>
  <type>pom</type>
</dependency>

或 Gradle:

compile 'com.lhalcyon:basic-adapter:1.0.1' 

用法:

初始化適配器:

BasicParams p = new BasicController.Builder()
                    .layoutRes(R.layout.item)//普通條目布局 ,必要屬性
                    .build();
mRecyclerView.setAdapter(mAdapter = new MyAdapter(p,list));

可選的配置如下:

BasicParams p = new BasicController.Builder()
               .layoutRes(R.layout.item)
               .header(header)
               .header(header2)
               .footer(footer)
               .empty(empty)
               .loaded(loaded)//沒有更多數據  布局
               .loading(loading)//上拉加載 布局
               .onLoadMore(new OnLoadMoreListener() {//加載更多監聽(注意線程)
                    @Override
                    public void onLoad() {
                       //加載更多
                    }
                })
               .build();            
img
img

單/多選 條目配置

BasicParams params = new BasicController.Builder()
                .checkId(R.id.checkbox)//checkable 控件 id, 目前只支持條目id唯一
                .choiceMode(BasicController.CHOICE_MODE_MULTIPLE)//選擇模式 單選,多,無
                .layoutRes(R.layout.item_check)
                .build();

再復寫方法 isItemChecked(T t,int position) 和設置 OnItemClickListener ,這兩部不能省略

mRecyclerView.setAdapter(mAdapter = new CheckAdapter(params,mManList){
            @Override
            public boolean isItemChecked(Man man, int position) {
                return man.isSingle;
              //必復寫的方法,用來初始化條目選擇狀態,如果適配器為單選,此方法卻有多個條目返回true,則只有最后一個返回true的條目是選中的.
            }
        });
mAdapter.setOnItemClickListener(mRecyclerView, new OnItemClickListener() {
            @Override
            public void onItemClick(BaseViewHolder vh, int position) {
                //單擊條目事件,必須設置,內容可空
            }
        });

單選模式:

single choice
single choice

多選模式:

multiple choice
multiple choice

gif效果比較差 :( , 在真機以及模擬器上效果不錯.


本庫采用的是BaseRecyclerViewAdapterHelper 的思路,將header,footer,loading等布局做成條目布局.而細節上又有所不同.原庫位置是根據不同條件做了很多判斷,比較復雜.本庫將這些布局做了相應的固定,假設List<T> mData 為數據集合:

布局 條件 位置 備注
Header 常駐 0 headers的容器(LinearLayout)
Empty mData.size()==0 1 根據數據集合大小判斷
Normal 有數據時顯示 [1,mData.size()] 和Empty同時只有一類存在
Load 常駐 mData.size() + 1 + empty 加載中loading/沒有更多數據loaded容器
Footer 常駐 mData.size() + 2 + empty footers的容器(LinearLayout)

int empty = mData.size() == 0 ? 1 : 0;

Header,Footer,Load都是常駐的,均為高度wrap_contentLinearLayout.因此不需要做復雜的邏輯判斷,沒有配置這些條目的時候因為是wrap_content所以均不顯示.

需要注意的是,由于Load布局是作為一個條目布局,因此有個預加載的效果,即此條目可見的時候便出發了加載更多的監聽.如果當前頁面數據條目加上加載更多請求回來的數據條目還不到一個屏幕的話,會接連觸發第二次加載更多,造成不好的體驗.因此在UI條目高度較小,或者請求PageSize較小時慎用.

單/多選 配置以及效果上面已經介紹過了.具體代碼可以參考sample里面的.

需要注意的是,在choice mode為single的時候,內部是改變了所有item的check state,然后調用notifyDataSetChange(),此時UI上如果是Material Design的Checkbox便不會有動畫的渲染便直接選中.此處若有解決思路或者辦法,希望一起討論下.

GitHub地址basic-adapter 希望能給個star~! :)

或者有什么意見和建議的可以私信我,后面的版本中做些完善~

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,461評論 6 532
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,538評論 3 417
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,423評論 0 375
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,991評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,761評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,207評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,268評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,419評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,959評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,782評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,983評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,528評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,222評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,653評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,901評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,678評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,978評論 2 374

推薦閱讀更多精彩內容