Android SwipeRefreshLayout左右滑动冲突的解决
我有一个页面是需要下拉刷新的,所以在 <RecyclerView>
的外层包了 <SwipeRefreshLayout>
,但是同时我希望 <RecyclerView>
里的组件,可以支持左右滑动,比如,右滑删除,左滑编辑。
答案是通过 ItemTouchHelper
来实现,诸如:
ItemTouchHelper(createItemTouchCallback(adapter)).attachToRecyclerView(main_recycler_view)
private fun createItemTouchCallback(adapter: BKRecyclerViewAdapter): ItemTouchHelper.SimpleCallback {
// ...
}
实现完成之后,的确可以左右滑动,但是会带来一个小问题,那就是 SwipeRefreshLayout
特别灵敏,左右滑动的时候,稍微带有
一点向下的方向,就会触发下拉刷新,导致左右滑动被取消,那么解决方案是什么呢?方案就是,检查左右滑动的量,然后当水平
偏移达到一定程度的时候,禁用下拉刷新,当复原,或者滑动完成之后,重新启用下拉刷新:
override fun onChildDraw(
c: Canvas,
recyclerView: RecyclerView,
viewHolder: RecyclerView.ViewHolder,
dX: Float,
dY: Float,
actionState: Int,
isCurrentlyActive: Boolean
) {
val textMargin = resources.getDimension(R.dimen.mdtp_ampm_label_size).roundToInt()
val width = viewHolder.itemView.width
val absDX = abs(dX)
main_swipe_refresh.isEnabled = !(5 <= absDX && absDX <= viewHolder.itemView.width - 5) // 重点在这里
// ...
}
override fun onSwiped(viewHolder: RecyclerView.ViewHolder, direction: Int) {
main_swipe_refresh.isEnabled = true
// ...
}
上面的,超过5像素就禁用下拉刷新,是我自己调出来的参数,大家可以自己在设备上调一调。
更多文章
本站热门
- socks5 协议详解
- zerotier简明教程
- 搞定面试中的系统设计题
- 用peewee代替SQLAlchemy
- frp 源码阅读与分析(一):流程和概念
- Golang(Go语言)中实现典型的fork调用
- DNSCrypt简明教程
- 一个Gunicorn worker数量引发的血案
- Golang validator使用教程
- Docker组件介绍(一):runc和containerd
- Docker组件介绍(二):shim, docker-init和docker-proxy
- 使用Go语言实现一个异步任务框架
- 协程(coroutine)简介 - 什么是协程?
- SQLAlchemy简明教程
- Go Module 简明教程