Stop SwipeRefreshLayout刷新动画,尽管setRefresh(false)/ isRefreshing = false

问题描述 投票:3回答:1

我正在使用SwipeRefreshLayout刷新我的活动。布局看起来像这样,非常简单:

<androidx.swiperefreshlayout.widget.SwipeRefreshLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        android:id="@+id/swipeRefreshLayout"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    <androidx.core.widget.NestedScrollView
            android:id="@+id/feedBase"
            android:layout_width="match_parent"
            android:layout_height="match_parent">
        <LinearLayout
                android:id="@+id/linearLayoutFeed"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:orientation="vertical"/>
    </androidx.core.widget.NestedScrollView>
</androidx.swiperefreshlayout.widget.SwipeRefreshLayout>

linearLayoutFeed通过刷新以编程方式添加了一些视图,并且在线加载了数据。该过程完成后,我调用isRefreshing=false(Java等效项为setRefreshing(false)。这似乎是停止它的唯一方法,这也是其他问题的建议。但是,这不起作用。

刷新指示器永不消失。我检查了调试器,操作完成,并调用了isRefreshing=false的回调。之后,我检查了isRefreshing的值,它正确显示了false

这是我运行的(简体)代码:

swipeRefreshLayout.setOnRefreshListener {
        loadData() { // callback
            (context as AppCompatActivity).runOnUiThread {
                swipeRefreshLayout.isRefreshing = false
            }
        }
    }

private fun loadData(callback: () -> Unit) {
    Thread {
        try {
            // loading my data
        } catch (e: Exception) {
            e.printStackTrace()
        } finally {
            callback.invoke()
        }
    }.start()
}

这基本上是我在此处和其他站点上在其他问题/答案中所读到的内容。但是,setRefreshing的文档指出:

通知窗口小部件刷新状态已更改。当滑动手势触发刷新时,请勿调用此选项。

我已经寻找了其他函数来调用以结束刷新,或者只是未设置刷新,但是我没有找到任何其他手段,也没有设置它可以工作。

现在是复杂的部分:

SwipeRefreshLayoutViewPager一起设置为TabLayoutSwipeRefreshLayout仅在第一页上。现在,当我第一次刷新它时,刷新指示器不会消失。但是,当我将页面切换到最后一页然后又回到第一页并刷新时,刷新指示符在完成后消失。

基本上如此

  • 选择第1页
  • 拉手势
  • 第1页已刷新,刷新指示没有消失
  • 选择第5页
  • 选择第1页,刷新指示器不见了
  • 拉手势
  • 刷新页面1,刷新指示消失

我不太了解这种行为,希望对这里的问题有所帮助。我不认为我可以通过页面切换来更改SwipeRefreshLayout的行为,但是以某种方式可以改变。

编辑

回答评论中的问题:

  • 这是否在主线程中全部发生?
    • loadData启动一个新线程。在该线程中,我通过runOnUiThread在主线程中执行了某些操作,当然,如上图所示,回调也是runOnUiThread
  • 您是否尝试将状态更改发布到小部件? (认为​​:swipeLayout.post {swipeLayout.isRefreshing = false}
    • 是,我尝试了postDelayed,具有1000ms和5000ms
  • 您是否尝试在刷卡刷新时调用enabled = false?
    • 是的,基本上发生了相同的事情。刷新指示器停留在原处。当我如上所述切换页面并尝试再次刷新时,按预期,它根本不再起作用。

编辑2

我刚刚注意到,虽然发生此错误,但我可以继续滑动。当第一个刷新指示器仍保持在原位时,第二个刷新指示器将出现并根据需要消失。

java android android-layout kotlin swiperefreshlayout
1个回答
0
投票

好像我有一些基本知识是错误的,或者至少是对我的活动/布局/视图的构建有错误的理解。

© www.soinside.com 2019 - 2024. All rights reserved.