1.如何高效、简单实现菜单拖拽排序?
2.Android下拉刷新&上拉加载更多组件记录(81/100)
如何高效、简单实现菜单拖拽排序?
本文主角是ItemTouchHelper,它是RecyclerView对于item交互处理的一个辅助类,主要用于拖拽以及滑动处理。通过接口实现的spring源码解读与方式,达到配置简单、逻辑解耦、职责分明的效果,并且支持所有的布局方式。实现主要包含自定义一个类,实现ItemTouchHelper.Callback接口,并在实现方法中根据需求简单配置。接口包含三个必须实现的方法:getMovementFlags、onMove和onSwiped。getMovementFlags用于创建交互方式,一键建站源码交互方式分为两种,最后通过makeMovementFlags把结果返回回去,makeMovementFlags接收两个参数,dragFlags和swipeFlags,即上面拖拽和滑动组合的标志位。onMove方法在拖拽时回调,这里主要对起始位置和目标位置的item做一个数据交换,然后刷新视图显示。onSwiped方法在滑动时回调,这个回调方法里主要是做数据和视图的更新操作。
接下来就是把这个辅助类绑定到RecyclerView。上面接口实现部分我们已经简单写好了,逻辑也挺简单,总共不超过行代码。绑定只需要调用attachToRecyclerView就好了。java贪吃蛇源码至此,简单的效果就已经实现了。下面开始优化和进阶的部分。
为了优化,我们添加了设置分割线的功能。RecyclerView网格布局实现等分,我们一般先是自定义ItemDecoration,然后调用addItemDecoration来实现的。但是我在实现效果的时候遇到一个问题,因为我加了布局切换的功能,在每次切换的时候,针对不同的布局分别设置layoutManager和ItemDecoration,这就导致随着切换次数的增加,item的间隔就越大。addItemDecoration,微信页游源码顾名思义是添加,通过查看源码发现RecyclerView内部是有一个ArrayList来维护的,所以当我们重复调用addItemDecoration方法时,分割线是以递增的方式在增加的,并且在绘制的时候会从集合中遍历所有的分割线绘制。部分源码显示了这一过程。
既然知道了问题所在,也大概想到了3种解决办法:1.调用addItemDecoration前,先调用removeItemDecoration方法remove掉之前所有的分割线;2.调用addItemDecoration(@NonNull ItemDecoration decor, int index),通过index来维护。实际上并不太行...因为始终都有两个分割线实例。我们再来梳理一下:我想到另外一个办法,不对RecyclerView做处理了,既然两种布局都有分割线,是剑灵卡刀源码不是可以把分割线合二为一了,然后根据LayoutManager去绘制不同的分割线?理论上是可行的,事实上也确实可以...自定义分割线:
为了提升用户体验,我们添加了选中放大/背景变色的功能。这里用到ItemTouchHelper.Callback中的两个方法,onSelectedChanged和clearView。我们需要在选中时改变视图显示,结束时再恢复。onSelectedChanged方法在拖拽或滑动发生改变时回调,这时我们可以修改item的视图。clearView方法在拖拽或滑动结束时回调,这时我们要把改变后的item视图恢复到初始状态。
在实际需求中,我们可能还需要实现固定位置的功能。定义一个固定值,并设置不同的背景色和其他菜单区分开。在onMove方法中判断,只要是固定位置就直接返回false。虽然第一个菜单无法交换位置了,但是它还是可以拖拽的。为了进一步提升用户体验,我们可以让固定位置不可以拖拽。ItemTouchHelper.Callback中有两个方法可以实现这一点:这俩方法默认都是true,所以即使不能交换位置,但默认也是支持操作的。我们可以通过重写isLongPressDragEnabled方法把它禁掉,然后再非固定位置的时候去手动开启。
在进行拖拽操作时,下标其实是变化的,在做相应的操作时,要取实时位置。不管是拖拽还是滑动,其实本质都是对Adapter内已填充的数据进行操作,实时数据通过Adapter获取即可。如果想要实现重置功能,直接拿最开始的原始数据重新塞给Adapter即可。
在看源码时,找对一个切入点,往往能达到事半功倍的效果。这里就从绑定RecyclerView开始吧。实例化ItemTouchHelper,然后调用其attachToRecyclerView方法绑定到RecyclerView。在这一过程中,代码其实有点意思的,解读一下:关键点在于通过触摸和手势识别来处理交互显示。通过MotionEvent来判断并调用相应的回调方法,如select、checkSelectForSwipe和moveIfNecessary,最终通过invalidate()方法实时刷新界面。
总结源码,本质工作都是由源码帮我们做了,我们只需要在回调里根据结果处理业务逻辑即可。通过上述步骤,我们可以实现高效的菜单拖拽排序功能,提升用户体验。
Android下拉刷新&上拉加载更多组件记录(/)
SmartRefreshLayout,一个旨在提供强大、稳定和成熟的下拉刷新体验的组件。它智能地支持所有视图和多层嵌套结构,通过继承 ViewGroup 而非 FrameLayout 或 LinearLayout,以提高性能。SmartRefreshLayout 吸收并融合了市面上流行的下拉刷新组件的优点,包括谷歌的 SwipeRefreshLayout 和其他第三方组件如 Ultra-Pull-To-Refresh、TwinklingRefreshLayout。此外,它还提供了一系列炫酷的 Header 和 Footer,丰富了用户体验。
以下是 SmartRefreshLayout 的实际应用效果。布局设计和预览效果已经展示,直观地呈现了组件的使用方式和外观。
在业务层面,SmartRefreshLayout 的集成与配置需要与特定应用的业务逻辑相协调,以实现高效的数据加载和刷新操作。
SmartRefreshLayout 的源代码托管在码云 GitHub,方便开发者进行下载、使用和反馈。
对于 API 接口的开发,smartApi-v1.0.0 版本的正式发布,标志着历时一年半的开发工作终于迎来了成果。这款工具对标国外的 Postman,旨在为 API 调试和开发提供强大的支持。尽管开发团队仅有一人,但v1.0.0版本已经提供了核心功能,包括但不限于 API 请求的发送、响应的接收和详细的日志记录。
为了便于用户获取和使用 smartApi,开发者提供了一个下载链接,指向百度网盘,确保工具能够迅速到达有需求的开发者手中。