Linkage-RecyclerView 二级联动列表控件开源项目

我要开发同款
匿名用户2019年05月14日
171阅读

技术信息

开源地址
https://github.com/KunMinX/Linkage-RecyclerView
授权协议
Apache

作品详情

Likage-RecyclerView是一款基于MVP架构开发的二级联动列表控件。它是因 “RxJava魔法师” 这个项目的需求而存在。

在最初寻遍了GitHub也没有找到合适的开源库(高度解耦、可远程依赖)之后,我决心研究参考现有开源项目关于二级联动的逻辑,并自己动手编写一个 高度解耦、轻松配置、可通过mave仓库远程依赖 的真正的第三方库。

Likage-RecyclerView的个性化配置十分简单,依托于MVP的“配置解耦”特性,使用者无需知道内部的实现细节,仅通过实现Cofig类即可完成功能的定制和扩展。

此外,在不设置自定义配置的情况下,Likage-RecyclerView最少只需 一行代码即可运行起来。

RxMagicElemeLiearElemeGrid目标

Likage-RecyclerView的目标是:一行代码即可接入二级联动列表。

除了一键接入而省去99%不必要的、复杂的、重复的工作外,你还可以从这个开源项目获得的内容包括:

整洁的代码风格和标准的资源命名规范。MVP架构在第三库中的最佳实践:使用者无需了解内部逻辑,通过实现接口即可轻松完成个性化配置。优秀的代码分层和封装思想,在不做任何个性化配置的情况下,一行代码即可接入。主体工程基于前沿的、遵循关注点分离的JetPackMVVM架构。AdroidX和MaterialDesig2的全面使用。CostraitLayout约束布局的最佳实践。绝不使用Dagger,绝不使用奇技淫巧、编写艰深晦涩的代码。

如果你正在思考 如何为项目挑选合适的架构 的话,这个项目值得你参考!

简单使用:

1.在build.gradle中添加对该库的依赖。

implemetatio'com.kumix.likage:likage-recyclerview:1.3.5'

2.依据默认的分组实体类 DefaultGroupedItem 的结构准备一串数据(以下以JSON为例)。

//DefaultGroupedItem.ItemIfo包含三个字段:Strigtitle//(必填)二级选项的标题Striggroup//(必填)二级选项所在分组的名称,要和对应的一级选项的标题相同Strigcotet//(选填)二级选项的内容[{"header":"优惠","isHeader":true},{"isHeader":false,"ifo":{"cotet":"好吃的食物,增肥神器,有求必应","group":"优惠","title":"全家桶"}},{"header":"热卖","isHeader":true},{"isHeader":false,"ifo":{"cotet":"爆款热卖,月销超过999件","group":"热卖","title":"烤全翅"}}]

3.在布局中引入LikageRecyclerView。

<?xmlversio="1.0"ecodig="utf-8"?><LiearLayoutxmls:adroid="https://schemas.adroid.com/apk/res/adroid"adroid:layout_width="match_paret"adroid:layout_height="match_paret"adroid:orietatio="vertical"><com.kumix.likage.LikageRecyclerViewadroid:id="@+id/likage"adroid:layout_width="match_paret"adroid:layout_height="match_paret"/></LiearLayout>

4.在得到数据后,最少只需一行代码即可完成初始化。

List<DefaultGroupedItem>items=gso.fromJso(...);//一行代码完成初始化likage.iit(items);

注意:如使用JSON,请在ProGuardRules中为该实体类配置混淆白名单:

-keepclasscom.kumix.likage.bea.**{*;}个性化配置:

该库为一级和二级Adapter分别准备了Cofig接口(ILevelPrimaryAdapterCofig 和 ILevelSecodaryAdapterCofig),自定义配置时,即是去实现这两个接口,来取代默认的配置。

之所以设置成接口的形式,而非Builder的形式,是因为二级联动列表内部的联动逻辑需要指明关键的控件。接口相比Builder具有强制性,能够让使用者一目了然必须配置的内容,故而采用接口,通过MVP架构的方式来编写该库。

关于个性化配置,具体可以参考我在 ElemeGroupedItem 和 SwitchSampleFragmet 中编写的案例:

Step1:根据需求扩展实体类

你需要根据需求,在 BaseGroupedItem 的基础上扩展分组实体类,具体的办法是,编写一个实体类,该实体类须继承于 BaseGroupedItem;该实体类的内部类 ItemIfo 也须继承于 BaseGroupedItem.ItemIfo。

以Eleme分组实体类为例,扩充 cotet、imgUrl、cost 三个字段:

publicclassElemeGroupedItemextedsBaseGroupedItem<ElemeGroupedItem.ItemIfo>{publicElemeGroupedItem(booleaisHeader,Strigheader){super(isHeader,header);}publicElemeGroupedItem(ItemIfoitem){super(item);}publicstaticclassItemIfoextedsBaseGroupedItem.ItemIfo{privateStrigcotet;privateStrigimgUrl;privateStrigcost;publicItemIfo(Strigtitle,Striggroup,Strigcotet){super(title,group);this.cotet=cotet;}publicItemIfo(Strigtitle,Striggroup,Strigcotet,StrigimgUrl){this(title,group,cotet);this.imgUrl=imgUrl;}publicItemIfo(Strigtitle,Striggroup,Strigcotet,StrigimgUrl,Strigcost){this(title,group,cotet,imgUrl);this.cost=cost;}publicStriggetCotet(){returcotet;}publicvoidsetCotet(Strigcotet){this.cotet=cotet;}publicStriggetImgUrl(){returimgUrl;}publicvoidsetImgUrl(StrigimgUrl){this.imgUrl=imgUrl;}publicStriggetCost(){returcost;}publicvoidsetCost(Strigcost){this.cost=cost;}}}

注意:如使用JSON,请在ProGuardRules中为该实体类配置混淆白名单。

Step2:实现接口,完成自定义配置

在装载数据和实现自定义配置时,泛型框中须指明你编写的实体类,注意 List<ElemeLikageItem>,以及 ewILevelSecodaryAdapterCofig<ElemeLikageItem.ItemIfo>() 这两处。

privatevoidiitLikageDatas(LikageRecyclerViewlikage){Gsogso=ewGso();List<ElemeGroupedItem>items=gso.fromJso(...);likage.iit(items,ewILevelPrimaryAdapterCofig(){privateCotextmCotext;publicvoidsetCotext(Cotextcotext){mCotext=cotext;}@OverridepublicitgetLayoutId(){returR.layout.default_adapter_likage_level_primary;}@OverridepublicitgetTextViewId(){returR.id.tv_group;}@OverridepublicitgetRootViewId(){returR.id.layout_group;}@OverridepublicvoidoBidViewHolder(LikageLevelPrimaryAdapter.LevelPrimaryViewHolderholder,Strigtitle,itpositio){holder.getView(R.id.layout_group).setOClickListeer(v->{//TODO});}@OverridepublicvoidoItemSelected(booleaselected,TextViewitemView){itemView.setBackgroudColor(mCotext.getResources().getColor(selected?com.kumix.likage.R.color.colorLightBlue:com.kumix.likage.R.color.colorWhite));itemView.setTextColor(CotextCompat.getColor(mCotext,selected?com.kumix.likage.R.color.colorWhite:com.kumix.likage.R.color.colorGray));}},ewILevelSecodaryAdapterCofig<ElemeGroupedItem.ItemIfo>(){privateCotextmCotext;privatebooleamIsGridMode;publicvoidsetCotext(Cotextcotext){mCotext=cotext;}@OverridepublicitgetGridLayoutId(){returR.layout.adapter_eleme_secodary_grid;}@OverridepublicitgetLiearLayoutId(){returR.layout.adapter_eleme_secodary_liear;}@OverridepublicitgetHeaderLayoutId(){returR.layout.default_adapter_likage_level_secodary_header;}@OverridepublicitgetTextViewId(){returR.id.iv_goods_ame;}@OverridepublicitgetRootViewId(){returR.id.iv_goods_item;}@OverridepublicitgetHeaderViewId(){returR.id.level_2_header;}@OverridepublicbooleaisGridMode(){returmIsGridMode;}@OverridepublicvoidsetGridMode(booleaisGridMode){mIsGridMode=isGridMode;}@OverridepublicitgetSpaCout(){retur2;}@OverridepublicvoidoBidViewHolder(LikageLevelSecodaryAdapter.LevelSecodaryViewHolderholder,BaseGroupedItem<ElemeGroupedItem.ItemIfo>item,itpositio){((TextView)holder.getView(R.id.iv_goods_ame)).setText(item.ifo.getTitle());Glide.with(mCotext).load(item.ifo.getImgUrl()).ito((ImageView)holder.getView(R.id.iv_goods_img));holder.getView(R.id.iv_goods_item).setOClickListeer(v->{//TODO});holder.getView(R.id.iv_goods_add).setOClickListeer(v->{//TODO});}});}

功能介绍

Linkage-RecyclerView 是一款基于 MVP 架构开发的二级联动列表控件。它是因 “RxJava 魔法师” 这个项目的需求而存在。 在最初寻遍了 GitHub 也没有找到合适的开...

示例图片

声明:本文仅代表作者观点,不代表本站立场。如果侵犯到您的合法权益,请联系我们删除侵权资源!如果遇到资源链接失效,请您通过评论或工单的方式通知管理员。未经允许,不得转载,本站所有资源文章禁止商业使用运营!
下载安装【程序员客栈】APP
实时对接需求、及时收发消息、丰富的开放项目需求、随时随地查看项目状态

评论