Git Product home page Git Product logo

angcyo / dsladapter Goto Github PK

View Code? Open in Web Editor NEW
643.0 8.0 50.0 34.98 MB

:fire: Android Kotlin时代的Adapter, Dsl 的形式使用 RecyclerView.Adapter, 支持折叠展开, 树结构,悬停,情感图状态切换, 加载更多, 多类型Item,侧滑菜单等

Home Page: https://github.com/angcyo/HoverItemDecoration

License: MIT License

Kotlin 100.00%
android kotlin dsl adapter recyclerview light state load-more flod group

dsladapter's Introduction

DslAdapter

API GitHub branch checks state GitHub AndroidX GitHub top language JitPack

GitHub code size in bytes GitHub repo size GitHub last commit GitHub issues GitHub Repo stars GitHub forks

Kotlin时代的Adapter.

Dsl 的形式使用 RecyclerView.Adapter, 支持情感图状态切换, 加载更多, 多类型Item

Gitee仓库地址

文档地址

有何用?

只有一个目的高效开发, 一切都是为了效率.

可能以前写界面, 还在为了继承某个xxActivityorxxFragment, xml布局到底使用xxLayout而烦扰.

有了DslAdapter, 一切皆是RecyclerView的天下.

你所能见到的普通界面,列表界面,带滚动的界面等等, 都可以使用DslAdapter轻松高效实现.

注意:轻松高效实现,轻松高效实现,轻松高效实现.

//普通界面渲染
dslAdapter.render {
    this + 普通1Item()
    this + 普通2Item()
    this + 普通3Item()
    ...
    底部普通Item()()
}

//列表界面渲染
dslAdapter.render {
    刷新指示器Item()()
    头部Item()()
    轮播图Item()()
    列表Item()()
    列表Item()()
    列表Item()()
    ...
    尾部Item()()
    加载更多Item()()
}

//普通界面和列表界面 如出一辙, 一点也不用惊讶,后面还有更刺激的.

//and so on

你没有看错, 就是这么简单, 就是这么高效. 一个字...爽 爽 爽...

任意界面, 都是由若干个相同Itemor不相同Item组合而成.

您所要做的就是:

  1. 将界面拆分成若干个Item
  2. 继承DslAdapterItem实现对应的Item即可

魅力无极限, 期待您的表现.

特性

  1. 全网最轻量多类型Item实现方法 (只需要关心布局+逻辑)
  2. 支持情感图状态(空布局 加载中 错误异常等)切换,完美支持自定义扩展 (也是一个Item)
  3. 支持加载更多 完美支持自定义扩展 (也是一个Item)
  4. 支持分组折叠 (类似QQ联系人好友分组,展开和折叠的效果)
  5. 支持Item悬停 (类似QQ联系人好友分组,悬停的效果)
  6. 支持常规的分割线 (一会儿占满屏幕 一会儿有点边距的效果)
  7. 支持单选/多选 (支持固定选项)
  8. 支持某一个Item更新时,定向更新多个其他Item (在表单编辑界面,很有用.)
  9. 支持群组功能 (指定连续的几个相同/不同的item为一组)
  10. 支持滑动选择(手指拖拽, 就可以选中范围内item)
  11. 支持拖拽排序 侧滑删除 (注意不是侧滑菜单)
  12. 支持树结构类似于idea中的文件列表目录结构 (支持异步加载)
  13. 支持左右侧滑菜单(2.4.0后)
  14. 支持DataBinding(3.0.0后)
  15. 支持ViewBinding(参考示例)
  16. 支持Item动画(4.3.0后)
  17. 支持将DslAdapterItem添加到任意ViewGroup中(5.1.0后)
  18. 支持单独将DslAdapterItemitemBind逻辑绑定在任意View中(5.1.0后)
  19. 新增IDslItem,并支持自动初始化(6.0.0minApi>=14)

功能展示

情感图切换 加载更多
情感图切换 加载更多
折叠展开 群组功能
折叠展开 群组功能
单选 多选
单选 多选
滑动选择 拖拽排序
滑动选择 拖拽排序
侧滑删除 树结构
侧滑删除 树结构
侧滑菜单 DslItem
侧滑菜单 DslItem

实战案例

多类型可复用内嵌Item 支持上下Item流的逻辑关联
多类型可复用内嵌Item 支持上下Item流的逻辑关联
IM界面也能完美胜任 可动态控制Item的表单界面
IM界面也能完美胜任 可动态控制Item的表单界面

疑问

如何实现最后一个Item撑满RecycleView底部的剩余空间(如果有)?

需要自定义ViewGroup, 在onLayout方法中, 计算出RecycleView底部的剩余空间, 赋值给LayoutParams即可.

使用JitPack的方式, 引入库.

根目录中的 build.gradle

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}

APP目录中的 build.gradle

dependencies {
    //androidx(推荐)
    implementation 'com.github.angcyo:DslAdapter:6.0.3'
    //支持DataBinding
    implementation 'com.github.angcyo:DslAdapter:3.0.0-binding'

    //support版请使用(不保证及时更新)
    implementation 'com.github.angcyo:DslAdapter:1.2.0'
    //跟随作者最新版请使用
    implementation 'com.github.angcyo:DslAdapter:master-SNAPSHOT'
}

发布的版本号,可以在这里查看. 点击查看

功能使用

请访问 WIKI文档 查看详情说明.

更新日志

点击查看

DslItem

正在整理的DslItem库, 囊括项目开发中能够见到的Item, 皆旨让开发更高效. 欢迎PR.

下载体验

扫码安装

扫码安装

License

FOSSA Status


群内有各(pian)种(ni)各(jin)样(qun)的大佬,等你来撩.

联系作者

点此QQ对话 该死的空格 点此快速加群

开源地址

扫码进群

给点鼓励

趋势

angcyo/DslAdapter

👏 感谢

angcyo/DslAdapter

dsladapter's People

Contributors

angcyo 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

dsladapter's Issues

addLastItem 问题

老哥,在界面初始化时,通过addLastItem加载DslAdapterItem集合,item会出现堆积在一起后再按顺序显示的情况,这个怎么才能优化下呢?

关于侧滑菜单和长按拖动的问题

SwipeMenuHelper.install(this); DragCallbackHelper.install(this)
当两者同时开启的时候,左滑出现菜单,但是同时会触发长按的拖动效果。然后松手就可以上下拖动,甚至是左右侧滑菜单的时候就可以上下拖动了,有没有方法调用可以避免这种情况,还是说这两个不能同时设置呀~

请问间距设置没有效果一般是什么原因啊?

mBinding.recyclerView.apply {

        applyGridLayoutManager(3)
        setAdapterStatus(DslAdapterStatusItem.ADAPTER_STATUS_EMPTY)

        datas.forEach {
            append<DslAdapterItem>(DslAdapterItem().apply {
                itemLayoutId = R.layout.item_test
                itemBind = {itemHolder: DslViewHolder, itemPosition: Int, adapterItem: DslAdapterItem, payloads: List<Any> ->
                    itemHolder.tv(R.id.text_view)?.setText("我是$it")


                }
                onSetItemOffset = {
                        val offset = 20 * dpi
                        it.set(0, offset, offset, 0)
                        itemGroupParams.apply {
                            if (isEdgeLeft()){
                                it.left = offset
                            }
                            if (isEdgeBottom()){
                                it.bottom = offset
                            }
                        }
                    }
            })
        }

    }

分页加载

请问我是复杂的组布局想要实现翻页加载,怎么实现比较好呢?addLastItem总是直接就滚动到最后了,而且数据直接错位插到原来的数据里,updateSingleData是限定了item类型,希望能有更多常见场景的示例,能够更好上手啊

关于布局问题

如果一个页面中有轮播,有横向滑动的,有占满一行的,参考腾讯爱奇艺的推荐页,这种的怎么做好呢,是一个recycleview实现还是scrollveiw嵌套实现呢,这个好像不能用这个adapter实现吧

clearAllItems等清除功能不起作用

用一个adapter通过addLastItem切换两种不同的样式,且两个样式的数据也不一样
再切换的时候尝试过单独或同时使用clearAllItems,updateItemDepend,_updateAdapterItems,notifyDataSetChanged,notifyDataSetChanged,皆不能清除
请问除了每个样式用单独的adapter外,有没有什么办法可以用一个adapte,切换的时候清除数据后在插入新的item

【个人使用错误】关于初始群组折叠的问题 已close issue

如果手动切换折叠和展开状态,没有任何问题。但是想设置获取到数据就想折叠的时候就会闪烁一下。

举例:
打开Activity,获取到列表数据,隐藏第一组,设置列表头 itemGroupExtend = false
现象: 列表会闪烁一下,然后在折叠第一组
期望: 直接折叠第一组

view must have a tag

override fun onItemBind(
itemHolder: DslViewHolder,
itemPosition: Int,
adapterItem: DslAdapterItem,
payloads: List
) {
super.onItemBind(itemHolder, itemPosition, adapterItem, payloads)
ItemViewBindingItemBinding.bind(itemHolder.itemView).apply{
...
}
}

折叠+单选,折叠后无法及时更新

群组状态下:
1.选中组内某条数据
2.折叠这个群组
3.选中其他组内的数据
4.展开所有折叠的群组 发现有两条选中的状态

395_1662515796.mp4

排序相关

如何使用该库实现自动排序功能?我以前使用的是SortedList库进行排序的,现在改用了DslAdapter之后只能暴力更新了
val list = dslAdapter.dataItems.map { it as DailyPlanItem }
val cache2 = list.filter { it.nonData() }
val cache1 =
list.filter { !it.nonData() }
.sortedBy { it.info.timeString }
.toMutableList()
cache1.apply { addAll(cache2) }

            renderAdapter {
                updateItem("${it.itemTag}")
                resetItem(cache1)
            }

侧滑菜单fing动作和长按拖动的问题

device-2021-06-25-114248.mp4

复现:
4秒 时 慢慢向左滑动,然后拖拽当前ItemView, 菜单收缩, 【正常】

8秒时 向左fling,然后拖拽当前ItemView,会触发上下拖动的问题。 【冲突】

描述:
2.6.1修改手指左右滑动菜单时,上下滚动会触发拖拽的问题,
但是 如果打开菜单时是 fling操作,会触发LongPress效果,导致滑动时触发拖动效果。

Originally posted by @lijinshanmx in #7 (comment)

关于群组功能问题

正常代码如下:

截屏2021-06-25 12 05 34

demo中 使用的是 DslDemoItem即 DslAdapterItem的子类。这里为了简便直接使用内部类了。

错误代码如下:

截屏2021-06-25 12 07 47

这里直接使用 DslAdapterItem类型,然后itemGroups已正常填写,此时展开折叠的时候,会出现其他头部也显示隐藏的问题,感觉头部item和正常item混淆了。

错误示例录屏如下:

device-2021-06-25-121013.mp4

感觉这套框架挺好用的

和作者交流个问题。基于RecyclerView能不能构建一套compose那样的响应式框架啊?我总觉得是可以的。
借助DifferUtils应该也是可以做到增量刷新和差异化刷新的。只是需要构建一个通用的中间层,来模仿响应式。
不知道作者如何看待这个问题?

不能使用databinding吗

Process: com.iotimc.studentphone, PID: 9828
java.lang.RuntimeException: view must have a tag
at com.iotimc.studentphone.DataBinderMapperImpl.getDataBinder(DataBinderMapperImpl.java:107)
at androidx.databinding.MergedDataBinderMapper.getDataBinder(MergedDataBinderMapper.java:74)
at androidx.databinding.DataBindingUtil.bind(DataBindingUtil.java:199)
at androidx.databinding.ViewDataBinding.bind(ViewDataBinding.java:695)
at com.iotimc.studentphone.databinding.AdapterStudentContactList3Binding.bind(AdapterStudentContactList3Binding.java:134)
at com.iotimc.studentphone.databinding.AdapterStudentContactList3Binding.bind(AdapterStudentContactList3Binding.java:121)
at com.iotimc.studentphone.activity.studentmain.FragmentContactList$ContactItem.onItemBind(FragmentContactList.kt:245)
at com.angcyo.dsladapter.DslAdapterItem$itemBind$1.invoke(DslAdapterItem.kt:255)
at com.angcyo.dsladapter.DslAdapterItem$itemBind$1.invoke(DslAdapterItem.kt:254)
at com.angcyo.dsladapter.DslAdapter.onBindViewHolder(DslAdapter.kt:158)
at com.angcyo.dsladapter.DslAdapter.onBindViewHolder(DslAdapter.kt:25)
at androidx.recyclerview.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:7337)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:6194)
at androidx.recyclerview.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:6460)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6300)
at androidx.recyclerview.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:6296)
at androidx.recyclerview.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2330)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1631)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309)
at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3686)
at android.view.View.measure(View.java:23173)
at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:792)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:480)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:134)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:277)
at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:119)
at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1578)
at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1690)
at android.view.View.measure(View.java:23173)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23173)
at androidx.recyclerview.widget.RecyclerView$LayoutManager.measureChildWithMargins(RecyclerView.java:9681)
at androidx.recyclerview.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1657)
at androidx.recyclerview.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1591)
at androidx.recyclerview.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:668)
at androidx.recyclerview.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:4309)
at androidx.recyclerview.widget.RecyclerView.onMeasure(RecyclerView.java:3686)
at android.view.View.measure(View.java:23173)
at android.view.ViewGroup.measureChild(ViewGroup.java:6720)
at androidx.viewpager2.widget.ViewPager2.onMeasure(ViewPager2.java:498)
at android.view.View.measure(View.java:23173)
2022-06-20 19:21:16.678 9828-9828/com.iotimc.studentphone E/AndroidRuntime: at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23173)
at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:792)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measure(BasicMeasure.java:480)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.measureChildren(BasicMeasure.java:134)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:277)
at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:119)
at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1578)
at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1690)
at android.view.View.measure(View.java:23173)
at androidx.core.widget.NestedScrollView.measureChildWithMargins(NestedScrollView.java:1656)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.core.widget.NestedScrollView.onMeasure(NestedScrollView.java:601)
at android.view.View.measure(View.java:23173)
at androidx.swiperefreshlayout.widget.SwipeRefreshLayout.onMeasure(SwipeRefreshLayout.java:641)
at android.view.View.measure(View.java:23173)
at androidx.constraintlayout.widget.ConstraintLayout$Measurer.measure(ConstraintLayout.java:792)
at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:583)
at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.layout(ConstraintWidgetContainer.java:682)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solveLinearSystem(BasicMeasure.java:159)
at androidx.constraintlayout.solver.widgets.analyzer.BasicMeasure.solverMeasure(BasicMeasure.java:290)
at androidx.constraintlayout.solver.widgets.ConstraintWidgetContainer.measure(ConstraintWidgetContainer.java:119)
at androidx.constraintlayout.widget.ConstraintLayout.resolveSystem(ConstraintLayout.java:1578)
at androidx.constraintlayout.widget.ConstraintLayout.onMeasure(ConstraintLayout.java:1690)
at android.view.View.measure(View.java:23173)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at androidx.appcompat.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:145)
at android.view.View.measure(View.java:23173)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23173)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at android.view.View.measure(View.java:23173)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1535)
at android.widget.LinearLayout.measureVertical(LinearLayout.java:825)
at android.widget.LinearLayout.onMeasure(LinearLayout.java:704)
at android.view.View.measure(View.java:23173)
at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6749)
at android.widget.FrameLayout.onMeasure(FrameLayout.java:185)
at com.android.internal.policy.DecorView.onMeasure(DecorView.java:716)
at android.view.View.measure(View.java:23173)
at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2727)
at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1580)
at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1864)
2022-06-20 19:21:16.679 9828-9828/com.iotimc.studentphone E/AndroidRuntime: at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1468)
at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7208)
at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1004)
at android.view.Choreographer.doCallbacks(Choreographer.java:816)
at android.view.Choreographer.doFrame(Choreographer.java:751)
at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:990)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handler.dispatchMessage(Handler.java:99)
at android.os.Looper.loop(Looper.java:193)
at android.app.ActivityThread.main(ActivityThread.java:6692)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

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.