如何让 recyclerview 实现无感的上拉下拉刷新,向微信聊天记录那样?

2020-07-18 16:21:30 +08:00
 chillwind
基于 Paging 做了一版,效果基本能用,但是只依赖网络数据没有本地库,做动态删除就不行了。用传统的 RecyclerView.OnScrollListener 来做,底部的上拉刷新没问题,通过比较 findLastVisibleItemPosition 和当前 list 的大小很容易实现。但是做下拉刷新是就不太好做了,使用 SwipeRefreshLayout 能实现功能,但是体验很不好,没办法做到无感。感觉在 OnScrollListener onScrolled 里判断,但是没找到合适的判断条件。大家有什么好方案吗?
10785 次点击
所在节点    Android
10 条回复
paradoxs
2020-07-18 16:34:05 +08:00
微信那个是辣鸡方案,就是普通的提前加载,半屏了就去加载。。 只要你拖动快一点,就会有“加载感”了。

telegram 的加载方案才是无感的。
wnpllrzodiac
2020-07-18 16:51:00 +08:00
怎么做到无感?带宽无限?拉的快一定会没数据啊
CSM
2020-07-18 16:56:43 +08:00
微信的好用吗。。Telegram 的才是无感吧
DeweyReed
2020-07-18 18:32:27 +08:00
Paging 搭配 Room,要动态删除你直接删 Room 里的数据就可以。不想存到本地数据库里,可以用 Room 的 inMemoryDatabase 。
chillwind
2020-07-18 19:08:27 +08:00
@DeweyReed 用 paging 刷新时也会卡一下的,感觉是靠 SCROLL_STATE_IDLE 触发的加载数据,没有 onScrolled 里做的加载顺滑
DeweyReed
2020-07-18 21:08:04 +08:00
@chillwind 可以用 paging 的 placeholder 、增加 page size 、限制 RecyclerView 的最大滑动速度。Paging 是通过 adapter 操作的,不直接和 RecyclerView 通信。
chillwind
2020-07-19 21:41:50 +08:00
@DeweyReed 今天试了一下 paging + room,通过 onZeroItemsLoaded 初始化数据,onItemAtEndLoaded 拉取后面的数据,测试基本功能可用,但是 onItemAtFrontLoaded 数据会有问题,onItemAtFrontLoaded 开始就会执行,而且 RecyclerView 定位到 onItemAtFrontLoaded 的第一条数据,而不是 onZeroItemsLoaded 的第一条数据。不知道是不是我对 PagedList.BoundaryCallback 理解不对,还是有别的方法?
DeweyReed
2020-07-19 22:12:20 +08:00
@chillwind 可以考虑不用 onItemAtFrontLoaded,只用 onZeroItemsLoaded 和 onItemAtEndLoaded,自己管理第几页。可以参考官方 demo 。
说实话 Paging 的 API 其实挺怪的。。期待 Paging3 吧。
hfl1995
2020-07-22 10:13:57 +08:00
没办法做到完全无感,telegram 也能看到 loading,除非修改滑动的速率
fromzero
2020-07-25 11:04:13 +08:00
加一个 loadingView 的 itemType, 然后在 onBindViewHolder 的时候调用加载更多数据。然后移除 这个 loadingView

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/691153

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX