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阅读 211,123评论 6 490
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,031评论 2 384
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 156,723评论 0 345
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,357评论 1 283
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,412评论 5 384
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,760评论 1 289
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,904评论 3 405
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,672评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,118评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,456评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,599评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,264评论 4 328
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,857评论 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,731评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,956评论 1 264
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,286评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,465评论 2 348

推荐阅读更多精彩内容