Giter Club home page Giter Club logo

linkage-recyclerview's Introduction

真香警告:即使不用饿了么订餐,也请务必收藏好该库!

由来

Linkage-RecyclerView 是一款基于 “MVP 架构(依赖倒置原则)” 开发的二级联动列表控件。它是因 “RxJava 魔法师” 项目需求而存在。

最初寻遍 GitHub 也未找到合适开源库,于是决定另起炉灶,编写 高度解耦、轻松配置、可通过 Maven 仓库远程依赖 的真正第三方库。

Linkage-RecyclerView 个性化配置十分简单,依托于 MVP “配置解耦” 特性,使用者无需研究内部逻辑,仅通过实现 Config 类即可完成功能定制和扩展。

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

RxJava Magician Eleme Linear Eleme Grid
7.gif 2.gif 3.gif

 

目标

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

除一键接入省去 99% 不必要复杂重复工作外,您还可从该项目获得内容包括:

  1. 整洁代码风格和标准资源命名规范。
  2. MVP 架构在编写第三方库的最佳实践:使用者无需了解内部逻辑,简单配置即可使用
  3. 优秀代码分层和封装**,在不做任何个性化配置情况下,一行代码即可接入。
  4. 主体工程基于前沿 Jetpack 组件。
  5. AndroidX 和 Material Design 2 全面使用。
  6. ConstraintLayout 约束布局最佳实践。
  7. 绝不使用 Dagger,绝不使用奇技淫巧、编写艰深晦涩代码。

如果您正考虑 如何为项目挑选合适架构,这项目值得你参考!

 

简单使用:

1.在 build.gradle 添加依赖。

implementation 'com.kunminx.linkage:linkage-recyclerview:2.7.0'

提示:本库托管于 Maven Central,请自行在根目录 build.gradle 添加 mavenCentral()

2.依据默认分组实体类 DefaultGroupedItem 结构准备一串数据。此处以 JSON 为例:

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

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 数据,并对该数据进行遍历。在遍历过程中,实例化并装载 “本库实体类对象” 到列表中,以获本库所能使用的列表数据。(具体可参见 CustomJsonSampleFragment 示例)

2.注意:如后端直接使用本库实体类读写 JSON 数据,请在 ProGuard Rules 中为该实体类配置混淆白名单:

-keep class com.kunminx.linkage.bean.** {*;}

 

更多

更多自定义操作详见 Wiki 解析

 

Thanks to

material-components-android

AndroidX

 

My Pages

Email:[email protected]

Juejin:KunMinX 在掘金

 

License

Copyright 2018-present KunMinX

Licensed 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.0

Unless required by applicable law or agreed to in writing, software
distributed 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 and
limitations under the License.

linkage-recyclerview's People

Contributors

brotherofchina avatar kunminx avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

linkage-recyclerview's Issues

刷新数据时,重新调用init报错

Process: com.kunminx.linkagelistview, PID: 9368 java.lang.IndexOutOfBoundsException: Index: 0, Size: 0 at java.util.ArrayList.get(ArrayList.java:411) at com.kunminx.linkage.LinkageRecyclerView.initLinkageSecondary(LinkageRecyclerView.java:168) at com.kunminx.linkage.LinkageRecyclerView.init(LinkageRecyclerView.java:299) at com.kunminx.linkagelistview.ui.ElemeSampleFragment.lambda$onViewCreated$0$ElemeSampleFragment(ElemeSampleFragment.java:80) at com.kunminx.linkagelistview.ui.-$$Lambda$ElemeSampleFragment$hd8Xu7jn5TF8Lkwto2wiclv4fms.onClick(lambda) at android.view.View.performClick(View.java:5657) at android.view.View$PerformClick.run(View.java:22453) at android.os.Handler.handleCallback(Handler.java:751) at android.os.Handler.dispatchMessage(Handler.java:95) at android.os.Looper.loop(Looper.java:154) at android.app.ActivityThread.main(ActivityThread.java:6119) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)

数据操作怎么办?加一个或减一个 group 或 item 怎么刷新?

数据操作怎么办?加一个或减一个 group 或 item 怎么刷新?
现在你可以通过 LinkageRecyclerView 拿到一二级 adapter,并通过拿到 adapter 的数据,来完成数据的操作和列表的刷新。(具体可以参考 YoumiStoreSampleFragment)
demo里没有YoumiStoreSampleFragment

数据问题

当数据量大了,一个header里面有十几个itemInfo,然后有几十个header,而且iteminfo的数据是通过header中的id获取的,这样在initLinkageDatas要循环请求iteminfo,请问这样会造成卡顿嘛

联动有点卡顿 不够平滑

我用手机安装了一下demo左边的列表跨条目点击的时候特别卡顿 而且动画的延时感觉太长了 没有饿了么过渡的顺畅

请问怎么自定义HeaderView

想实现自定义Header,而不是单纯的一个TextView.
尝试过更改Header所在的Layout文件,但是只能TextView有"被顶上去"的效果,其余View则无办法"被顶上去"

点击+号按钮时,菜品数量+1,-号出现,但是滑动列表后-号消失了

作者你好,公司项目是一个点餐app,点击+号添加菜品,菜品数量+1,-号出现
代码:holder.getView(R.id.iv_goods_subtract).setVisibility(View.VISIBLE); holder.getView(R.id.tv_select_num).setVisibility(View.VISIBLE);
打印日志确实只执行了一次点击事件,但是会出现其他分类的几个菜品也出现菜品数量+1,-号出现的情况。这是第一个问题,item状态设置不正确。
滑动列表整个列表后,所有已经点击出现的菜品数量+1,-号都消失了,整个列表恢复成了初始化那样的,这是第二个问题。item状态无法保存。

cannot find symbol class FragmentElemeBinding

Dear Sir,
Thanks for your very nice library Linkage-RecyclerView . However, when I add the reference to gradle :

implementation 'com.kunminx.linkage:linkage-recyclerview:1.9.0'

then when i try to define below object:

private FragmentElemeBinding mBinding;

I get below error:
error: cannot find symbol class FragmentElemeBinding

This class seems not included into the library.

建议rv_primary的宽度改为可配置

layout_linkage_view.xml中左侧组列表的宽度目前貌似是100dp固定的:

<androidx.recyclerview.widget.RecyclerView android:id="@+id/rv_primary" android:layout_width="100dp" android:layout_height="match_parent" />

感觉改成配置比较好,毕竟每个设备上表现不太一样。

请问这一段代码在处理什么问题呢?

// the following logic can not be perfect, because tvHeader's title may not
// always equals to the title of selected primaryItem, while there
// are several groups which has little items to stick group item to tvHeader.
//
// To avoid to this extreme situation, my idea is to add a footer on the bottom,
// to help wholly execute this logic.
//
// Note: 2019.5.22 KunMinX

if (groupNameChanged) {
    List<String> groupNames = mPrimaryAdapter.getStrings();
    for (int i = 0; i < groupNames.size(); i++) {
        if (groupNames.get(i).equals(mLastGroupName)) {
            mPrimaryAdapter.setSelectedPosition(i);
            RecyclerViewScrollHelper.smoothScrollToPosition(mRvPrimary,
                                                            LinearSmoothScroller.SNAP_TO_END, i);
        }
    }
}

看了好久不清楚这段注释在说处理什么样的情况?

ItemInfo无法序列化

因为BaseGroupedItem.ItemInfo没有实现Serializable接口,造成ItemInfo无法序列化

关于Kotlin中init方法

我将demo 的fragment的代码转换为kotlin的,遇到LinkageRecyclerView.init(),第一个方法参数列表无法转换。
截图

反馈两个问题

1.右侧RecycleView的HeaderView和公用的浮动的HeaderView,不是同一个view,如果我要在HeaderView新增字段(如header显示个数,但是左侧不显示个数),这样我就必须修改库的源码,添加公用的浮动的HeaderView显示个数的代码;
2.点击左侧RecycleView的最后一个item,左侧会依次滚动到最后一个,右侧也会依次滚动,当我数据比较多的时候,滚动时间会比较长,影响体验。

页面刷新的问题

作者您好!
我再使用中遇到了个刷新的问题
数据源只做clear和addAll操作
linkage.getPrimaryAdapter().notifyDataSetChanged();
linkage.getSecondaryAdapter().notifyDataSetChanged();
上述代码不起作用
感谢

getSecondaryAdapter().getItems() 获取实体类强转报错

你好
List<***> items = linkage.getSecondaryAdapter().getItems();
在获取适配器中的数据后遍历报错:
java.lang.ClassCastException: com.kunminx.linkage.bean.DefaultGroupedItem cannot be cast to ***
这种错误,得不到想要的实体类
可以给解答一下吗

接#45 Decoration问题

#45 在Demo中,使用源数据个数都是双数.刚好填满2列数据. 如果在源数据个数单双数不确定的情况下,还是会出现无法判断column的问题..研究了几天还是没研究出来

@jianghao1123

@jianghao1123

实在看不出 “继承接口” 和 “局限于 JSON 数据” 有何因果关系。

JSON 只是结构化数据的方式之一,LinkageRecyclerView 并没有强制要求数据来源一定是 JSON,无论 XML,JSON,protocol buffer 还是何种方式,只要在能在移动端解析成 List 即可。

此外,数据分组依赖于抽象类中仅有的几个必填字段,用户自定义的 XXXGroupedItem 须继承于抽象类 BaseGroupedItem。

Originally posted by @KunMinX in #1 (comment)

数据适配

作者:

数据适配要么我们自己后台按照您demo定制接口(兼顾多端不太可能)
要么自己看源码扩展数据适配吗?看源码短时间也摸不透 短时间内没法使用啊 建议作者数据适配能不能介绍下扩展方法

联动问题!

1.关于一级菜单和二级菜单具体的联动是怎么实现的?
2.二级菜单的滑动以及Title怎么处理?

。。表示能力有限,源码看了挺久的还是没想明白。!!

关于数据结构

这个是要和后台配合才能做到的,然而实际情况是后台有他们的框架或者做法,这就有一定的局限性

指定item 显示到顶部

我看了一下,好像没有提供方法,指定item 显示到顶部
因为有一个需要是:
指定某个产品显示在顶部。所以需要这条item滚动到顶部

【 提问须知 】

如有 bug,请另外 new 一个 issue ⚠️⚠️⚠️

本项目开 issue 规范:

  1. 有任何 bug 都欢迎及时开 issue,我看到后予以处理。
  2. 如有使用上的疑问,请先认真阅读 Readme 和源码 sample,在没有找到答案后,另外开 issue。
  3. 如开 issue 是为了发表个人见解,请务必 客观、具体、严谨;严禁草率、乱入、带节奏:

务必注明观点所对应的场景,并附上完整可复现的代码,

不然缺乏一致的前提依据来有效交流!

任何缺乏实证依据和因果逻辑的泛泛而谈,都可能对其他使用者造成困扰。

在发表个人见解前,请先确保自己认真阅读过源码。这是对自己、对作者、对其他读者最起码的尊重。

底部的footview会重复加载数据的bug

将Linkage-RecyclerView放在dialog里面加载,每次dimiss之后,在打开.二级菜单的底部footview都会增加一个,每次都增加一个?这是啥bug为什么之后底部的footview会重复加载数据?其他的都显示正常

GridMode模式有ui问题

设置模式为GridMode模式,并且SPAN_COUNT_FOR_GRID_MODE为2时,当最后一行不到2个item,那么最后一行的item就会很长。demo是由于item的背景色跟底部的背景色一致所以看不出问题,当将demo中adapter_eleme_secondary_grid.xml的背景色设置为其他颜色,可以很快看出问题。

关于footer的问题

我这边设置的GridMode,这个footer特别影响UI,好像没有看到相关去掉的api,大神能把这个去掉吗。
就现在的业务需求来说,个人觉得很多的场景都不需要这个footer

发现小Bug

Snipaste_2021-01-22_19-48-49
无论是否自定义HeaderView,都存在这现象

一个关于实体类强转的问题

首先感谢您的分享!
我再开发中遇到了一个强转的问题
com.kunminx.linkage.bean.DefaultGroupedItem cannot be cast to com.ruwei.*****.view.bean.FoodGroupedItem
无论是通过linkage.getSecondaryAdapter().getItems()拿到数据还是直接操作数据源都会出现此问题;
FoodGroupedItem是继承自BaseGroupedItem;

报错代码:FoodGroupedItem item =(FoodGroupedItem ) mDatas.get(i);

Demo中删除item数据错乱闪退

在Demo中,YoumiStoreSampleFragment --》右边adapter 的删除功能按钮点击事件中取值是直接用了position,然后在删除功能中,删除这个position的item,最后调用了notifyItemRemoved来刷新适配器,第一次删除是没问题的,但是后面再删除的时候position会不对,因为使用了notifyItemRemoved 来刷新,但是adapter中的position是final修饰不会改变的,所以后面删除position都会错乱,应该在删除取值的时候使用hold.getAdapterPosition的值

holder.getView(R.id.iv_goods_add).setOnClickListener(v -> {
removeItem(holder.getAdapterPosition());
});

左边列表布局布局

左边列表能不能添加多个控件,怎么添加。
或者怎么实现我自己的ViewHolder

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.