V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
chillwind
V2EX  ›  Android

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

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

    telegram 的加载方案才是无感的。
    wnpllrzodiac
        2
    wnpllrzodiac  
       2020-07-18 16:51:00 +08:00 via Android
    怎么做到无感?带宽无限?拉的快一定会没数据啊
    CSM
        3
    CSM  
       2020-07-18 16:56:43 +08:00 via Android
    微信的好用吗。。Telegram 的才是无感吧
    DeweyReed
        4
    DeweyReed  
       2020-07-18 18:32:27 +08:00
    Paging 搭配 Room,要动态删除你直接删 Room 里的数据就可以。不想存到本地数据库里,可以用 Room 的 inMemoryDatabase 。
    chillwind
        5
    chillwind  
    OP
       2020-07-18 19:08:27 +08:00
    @DeweyReed 用 paging 刷新时也会卡一下的,感觉是靠 SCROLL_STATE_IDLE 触发的加载数据,没有 onScrolled 里做的加载顺滑
    DeweyReed
        6
    DeweyReed  
       2020-07-18 21:08:04 +08:00
    @chillwind 可以用 paging 的 placeholder 、增加 page size 、限制 RecyclerView 的最大滑动速度。Paging 是通过 adapter 操作的,不直接和 RecyclerView 通信。
    chillwind
        7
    chillwind  
    OP
       2020-07-19 21:41:50 +08:00
    @DeweyReed 今天试了一下 paging + room,通过 onZeroItemsLoaded 初始化数据,onItemAtEndLoaded 拉取后面的数据,测试基本功能可用,但是 onItemAtFrontLoaded 数据会有问题,onItemAtFrontLoaded 开始就会执行,而且 RecyclerView 定位到 onItemAtFrontLoaded 的第一条数据,而不是 onZeroItemsLoaded 的第一条数据。不知道是不是我对 PagedList.BoundaryCallback 理解不对,还是有别的方法?
    DeweyReed
        8
    DeweyReed  
       2020-07-19 22:12:20 +08:00
    @chillwind 可以考虑不用 onItemAtFrontLoaded,只用 onZeroItemsLoaded 和 onItemAtEndLoaded,自己管理第几页。可以参考官方 demo 。
    说实话 Paging 的 API 其实挺怪的。。期待 Paging3 吧。
    hfl1995
        9
    hfl1995  
       2020-07-22 10:13:57 +08:00
    没办法做到完全无感,telegram 也能看到 loading,除非修改滑动的速率
    fromzero
        10
    fromzero  
       2020-07-25 11:04:13 +08:00
    加一个 loadingView 的 itemType, 然后在 onBindViewHolder 的时候调用加载更多数据。然后移除 这个 loadingView
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2590 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 19ms · UTC 15:47 · PVG 23:47 · LAX 07:47 · JFK 10:47
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.