icode icode
首页
  • Android学习

    • 📁基础内容
    • 📺AndroidCore
    • 🎨Android-UI
    • 🏖️Components
    • 📊Fragment
    • 🔗网络操作
    • 🔏异步机制
    • 📦数据存储
    • 🗃️Gradle
  • 学习笔记

    • 『框架』笔记
    • 『Kotlin』笔记
    • 《Vue》笔记
    • 《Git》学习笔记
    • 『Bug踩坑记录』
  • ListView
  • RecyclerView
  • ViewPager
  • Java笔记

    • 🟠JavaSE
    • 🟢JavaWeb
    • 🔴JavaEE
    • ⚪JavaTopic
    • 🍳设计模式
  • 计算机基础

    • 📌计算机网络
    • 🔍数据结构
    • 📦数据库
    • 💻OS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 关于

    • 📫关于我
  • 收藏

    • 网站
    • 资源
    • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)

iqqcode

保持对技术的探索实践与热爱
首页
  • Android学习

    • 📁基础内容
    • 📺AndroidCore
    • 🎨Android-UI
    • 🏖️Components
    • 📊Fragment
    • 🔗网络操作
    • 🔏异步机制
    • 📦数据存储
    • 🗃️Gradle
  • 学习笔记

    • 『框架』笔记
    • 『Kotlin』笔记
    • 《Vue》笔记
    • 《Git》学习笔记
    • 『Bug踩坑记录』
  • ListView
  • RecyclerView
  • ViewPager
  • Java笔记

    • 🟠JavaSE
    • 🟢JavaWeb
    • 🔴JavaEE
    • ⚪JavaTopic
    • 🍳设计模式
  • 计算机基础

    • 📌计算机网络
    • 🔍数据结构
    • 📦数据库
    • 💻OS
  • 技术文档
  • GitHub技巧
  • Nodejs
  • 博客搭建
  • 学习
  • 面试
  • 心情杂货
  • 实用技巧
  • 友情链接
  • 关于

    • 📫关于我
  • 收藏

    • 网站
    • 资源
    • Vue资源
  • 分类
  • 标签
  • 归档
GitHub (opens new window)
  • ListView

  • RecyclerView

    • RecyclerView初识
    • item的点击事件
    • SwipeRefreshLayout下拉刷新
    • RecyclerView下拉刷新和上拉加载更多
    • 解决SwipeRefreshLayout和RecyclerView时滑动冲突
      • 问题复现
      • 解决方式
    • RecyclerView缓存复用机制
  • ViewPager

  • Component
  • RecyclerView
iqqcode
2022-07-02
目录

解决SwipeRefreshLayout和RecyclerView时滑动冲突

# 问题复现

SwipeRefreshLayout嵌套RecyclerView,当内容超过屏幕下拉,不知道你是要下拉刷新还是下滑,一直认为你是下拉刷新。

recycler_refresh

【问题伪代码】

class LogoActivity : AppCompatActivity() {

    private lateinit var binding: ActivityLogoBinding

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityLogoBinding.inflate(layoutInflater)
        setContentView(binding.root)

        // 初始化xml控件
        mRecyclerView = binding.mRecyclerView 
        mRefreshLayout = binding.refreshLayout
        
        onPullRefresh()
        onLoadMore()
    }
    
     /**
     * 下拉刷新
     */
    private fun onPullRefresh() {
        mRefreshLayout.setColorSchemeColors(Color.parseColor("#03A9F4"))
        mRefreshLayout.setOnRefreshListener {
            thread {
                Thread.sleep(700) // 这个延迟0.7秒只是为了实现视觉效果,与逻辑无关
                runOnUiThread {
                    loadNewData()
                    mRefreshLayout.isRefreshing = false // 让圆形进度条停下来
                }
            }
        }
    }
    
        private fun onLoadMore() {
        // 设置加载更多监听
        mRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
            override fun onScrollStateChanged(recyclerView: RecyclerView, newState: Int) {
                super.onScrollStateChanged(recyclerView, newState)
                val manager = recyclerView.layoutManager as LinearLayoutManager
                if (manager != null) {
                    // 当不滑动时
                    when (newState) {
                        RecyclerView.SCROLL_STATE_IDLE -> {
                            loadNewData()
                        }
                        RecyclerView.SCROLL_STATE_DRAGGING -> {}
                        RecyclerView.SCROLL_STATE_SETTLING -> {}
                        else -> {}
                    }
                }
            }

            override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
                super.onScrolled(recyclerView, dx, dy)
                // TODO: 在此处解决滑动冲突
            }
        })
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59

# 解决方式

在1上述TODO处添加代码

mRecyclerView.addOnScrollListener(object : RecyclerView.OnScrollListener() {
    override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
        super.onScrolled(recyclerView, dx, dy)
        val topRowVerticalPosition =
            if (recyclerView == null || recyclerView.childCount === 0)
                0 else recyclerView.getChildAt(0).top
        // 大于0表示正在向上滑动,小于等于0表示停止或向下滑动
        mRefreshLayout.isEnabled = topRowVerticalPosition >= 0
    }
})
1
2
3
4
5
6
7
8
9
10

添加好后,再测试一下就可以正常滑动了!

编辑 (opens new window)
上次更新: 2022/07/02, 23:36:04
RecyclerView下拉刷新和上拉加载更多
RecyclerView缓存复用机制

← RecyclerView下拉刷新和上拉加载更多 RecyclerView缓存复用机制→

最近更新
01
匿名内部类
10-08
02
函数式接口
10-08
03
ARouter-Kotlin踩坑
10-05
更多文章>
Theme by Vdoing | Copyright © 2021-2023 iqqcode | MIT License | 备案号-京ICP备2021028793号
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×