在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
开源软件名称:Linkage-RecyclerView开源软件地址:https://gitee.com/mirrors/Linkage-RecyclerView开源软件介绍:真香警告:即使不用饿了么订餐,也请务必收藏好该库!由来Linkage-RecyclerView 是一款基于 MVP 架构开发的二级联动列表控件。它是因 “RxJava 魔法师” 这个项目的需求而存在。 在最初寻遍了 GitHub 也没有找到合适的开源库(高度解耦、可远程依赖)之后,我决心研究参考现有开源项目关于二级联动的逻辑,并自己动手编写一个 高度解耦、轻松配置、可通过 Maven 仓库远程依赖 的真正的第三方库。 Linkage-RecyclerView 的个性化配置十分简单,依托于 MVP 的 “配置解耦” 特性,使用者无需知道内部的实现细节,仅通过实现 Config 类即可完成功能的定制和扩展。 此外,在不设置自定义配置的情况下,Linkage-RecyclerView 最少只需 一行代码即可运行起来。
目标Linkage-RecyclerView 的目标是:一行代码即可接入二级联动列表。 除了一键接入而省去 99% 不必要的、复杂的、重复的工作外,你还可以从这个开源项目获得的内容包括:
如果你正在思考 如何为项目挑选合适的架构 的话,这个项目值得你参考! 简单使用:1.在 build.gradle 中添加对该库的依赖。 implementation 'com.kunminx.linkage:linkage-recyclerview:2.6.0' 提示:鉴于 Jcenter 的关闭,我们已将仓库迁移至 Maven Central,请自行在根目录 build.gradle 添加 2.依据默认的分组实体类 // DefaultGroupedItem.ItemInfo 包含三个字段:String title //(必填)二级选项的标题String group //(必填)二级选项所在分组的名称,要和对应的一级选项的标题相同String content //(选填)二级选项的内容 List<TestGroupedItem> list = new ArrayList<>();//添加第 0 条记录:header 0list.add(new TestGroupedItem("优惠", true));//添加第 1 条记录:info 1TestGroupedItem.ItemInfo info1 = new TestGroupedItem.ItemInfo();info1.setContent("好吃的食物,增肥神器,有求必应");info1.setGroup("优惠");info1.setTitle("全家桶");list.add(new TestGroupedItem(info1, false));//添加第 2 条记录:header 2list.add(new TestGroupedItem("优惠", true));//添加第 3 条记录:info 3TestGroupedItem.ItemInfo info3 = new TestGroupedItem.ItemInfo("爆款热卖,月销超过 999 件", "热卖", "烤全翅");list.add(new TestGroupedItem(info3, false)); 3.在布局中引入 LinkageRecyclerView 。 <?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <com.kunminx.linkage.LinkageRecyclerView android:id="@+id/linkage" android:layout_width="match_parent" android:layout_height="match_parent"/></LinearLayout> 4.在得到数据后,最少只需一行代码即可完成初始化。 linkage.init(items); 温馨提示: 1.在实际的项目开发中,我们的做法通常是,从后端拿到和解析 JSON 数据,并对得到的数据进行遍历。在遍历过程中,我们实例化并装载本库的实体类对象到列表中,从而获得本库所能使用的列表数据。 2.注意:如使用 JSON,请在 ProGuard Rules 中为该实体类配置混淆白名单: -keep class com.kunminx.linkage.bean.** {*;} 个性化配置:该库为一级和二级 Adapter 分别准备了 Config 接口( 之所以设置成接口的形式,而非 Builder 的形式,是因为二级联动列表内部的联动逻辑需要指明关键的控件。接口相比 Builder 具有强制性,能够让使用者一目了然必须配置的内容,故而采用接口,通过 MVP 架构的方式来编写该库。 关于个性化配置,具体可以参考我在 Step1:根据需求扩展实体类你需要根据需求,在 以 Eleme 分组实体类为例,扩充 public class ElemeGroupedItem extends BaseGroupedItem<ElemeGroupedItem.ItemInfo> { public ElemeGroupedItem(boolean isHeader, String header) { super(isHeader, header); } public ElemeGroupedItem(ItemInfo item) { super(item); } public static class ItemInfo extends BaseGroupedItem.ItemInfo { private String content; private String imgUrl; private String cost; public ItemInfo(String title, String group, String content) { super(title, group); this.content = content; } public ItemInfo(String title, String group, String content, String imgUrl) { this(title, group, content); this.imgUrl = imgUrl; } public ItemInfo(String title, String group, String content, String imgUrl, String cost) { this(title, group, content, imgUrl); this.cost = cost; } public String getContent() { return content; } public void setContent(String content) { this.content = content; } public String getImgUrl() { return imgUrl; } public void setImgUrl(String imgUrl) { this.imgUrl = imgUrl; } public String getCost() { return cost; } public void setCost(String cost) { this.cost = cost; } }} 注意:如使用 JSON,请在 ProGuard Rules 中为该实体类配置混淆白名单。 Step2:实现接口,完成自定义配置在装载数据和实现自定义配置时,泛型框中须指明你编写的实体类,注意 private void initLinkageDatas(LinkageRecyclerView linkage) { List<ElemeGroupedItem> items = gson.fromJson(...); linkage.init(items, new ElemePrimaryAdapterConfig(), new ElemeSecondaryAdapterConfig());} private class ElemePrimaryAdapterConfig implements ILinkagePrimaryAdapterConfig { private Context mContext; public void setContext(Context context) { mContext = context; } @Override public int getLayoutId() { return R.layout.adapter_linkage_primary; } @Override public int getGroupTitleViewId() { return R.id.tv_group; } @Override public int getRootViewId() { return R.id.layout_group; } @Override public void onBindViewHolder(LinkagePrimaryViewHolder holder, boolean selected, String title) { TextView tvTitle = (TextView) holder.mGroupTitle; tvTitle.setText(title); tvTitle.setBackgroundColor(mContext.getResources().getColor( selected ? R.color.colorPurple : R.color.colorWhite)); tvTitle.setTextColor(ContextCompat.getColor(mContext, selected ? R.color.colorWhite : R.color.colorGray)); }}private class ElemeSecondaryAdapterConfig implements ILinkageSecondaryAdapterConfig<ElemeGroupedItem.ItemInfo> { private Context mContext; public void setContext(Context context) { mContext = context; } @Override public int getGridLayoutId() { return 0; } @Override public int getLinearLayoutId() { return R.layout.adapter_eleme_secondary_linear; } @Override public int getHeaderLayoutId() { return R.layout.adapter_linkage_secondary_header; } @Override public int getFooterLayoutId() { return 0; } @Override public int getHeaderTextViewId() { return R.id.secondary_header; } @Override public int getSpanCountOfGridMode() { return SPAN_COUNT_FOR_GRID_MODE; } @Override public void onBindViewHolder(LinkageSecondaryViewHolder holder, BaseGroupedItem<ElemeGroupedItem.ItemInfo> item) { ((TextView) holder.getView(R.id.iv_goods_name)).setText(item.info.getTitle()); holder.getView(R.id.iv_goods_item).setOnClickListener(v -> { //TODO }); } @Override public void onBindHeaderViewHolder(LinkageSecondaryHeaderViewHolder holder, BaseGroupedItem<ElemeGroupedItem.ItemInfo> item) { ((TextView) holder.getView(R.id.secondary_header)).setText(item.header); } @Override public void onBindFooterViewHolder(LinkageSecondaryFooterViewHolder holder, BaseGroupedItem<DefaultGroupedItem.ItemInfo> item) { //TODO }} Thanks toMy PagesEmail:[email protected] Juejin:KunMinX 在掘金 LicenseCopyright 2018-present KunMinXLicensed under the Apache License, Version 2.0 (the "License");you may not use this file except in compliance with the License.You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0Unless required by applicable law or agreed to in writing, softwaredistributed under the License is distributed on an "AS IS" BASIS,WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.See the License for the specific language governing permissions andlimitations under the License. |
请发表评论