Java 停止SwipeRefreshLayout刷新动画,尽管setRefresh(false)/isRefreshing=false

Java 停止SwipeRefreshLayout刷新动画,尽管setRefresh(false)/isRefreshing=false,java,android,android-layout,kotlin,swiperefreshlayout,Java,Android,Android Layout,Kotlin,Swiperefreshlayout,我正在使用SwipeRefreshLayout刷新我的活动。布局如下所示,非常简单: <androidx.swiperefreshlayout.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/sw

我正在使用
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>
这基本上就是我在这里和其他网站上读到的其他问题/答案。但是,
setRefreshing
的文档说明:

通知小部件刷新状态已更改。当刷卡手势触发刷新时,不要调用此选项

我已经寻找其他函数来调用以结束刷新或只是不设置刷新,但我没有找到任何其他方法,也没有设置它的工作

现在,对于复杂的部分:

SwipeRefreshLayout
被设置为带有
TabLayout
ViewPager
SwipeRefreshLayout
仅在第一页上。现在,当我第一次刷新它时,刷新指示器不会消失。但当我将页面切换到最后一页,然后再切换回第一页并刷新时,刷新指示器在完成后消失

所以基本上

  • 第1页已选定
  • 拉手势
  • 第1页已刷新,刷新指示器未消失
  • 第5页已选定
  • 已选择第1页,刷新指示器消失
  • 拉手势
  • 第1页刷新,刷新指示器消失
我不太理解这种行为,我想得到任何帮助来找出这里出了什么问题。我不认为我用页面开关改变了任何应该改变
SwipeRefreshLayout
行为的东西,但不知何故它确实改变了

编辑 回答评论中的问题:

  • 这一切都是在主线上发生的吗?
    • loadData启动一个新线程。在该线程中,我通过
      runOnUiThread
      在主线程中执行一些操作,当然如上所示,回调也是
      runOnUiThread
  • 您是否尝试将状态更改发布到小部件?(想想:swipeLayout.post{swipeLayout.isRefreshing=false}
    • 是的,我试过用1000ms和5000ms来延迟postdayed
  • 您是否尝试在刷卡刷新时调用enabled=false?
    • 是的,基本上发生了相同的事情。刷新指示器保持在原来的位置。当我按上述方式切换页面并再次尝试刷新时,它就不再像预期的那样工作了
编辑2
我只是注意到,当这个错误发生时,我可以继续滑动。当第一个刷新指示器仍然保持在原位时,它后面的第二个刷新指示器出现并消失,就像它应该出现一样。

看起来我有一些基本错误,或者至少对我的活动/布局/视图是如何建立的有错误的理解

装载指示器没有消失的原因是,它确实消失了。其中至少有一个消失了

我以为我有一个布局,但实际上有两个!但我只停用了其中一个

我对布局进行膨胀的自定义视图本身就是一个SwipeRefreshLayout。因此我认为我有以下层次结构:

SwipeRefreshLayout
->NestedScrollView
-->LinearLayout
SwipeRefreshLayout (View itself)
->SwipeRefreshLayout (from Layout)
-->NestedScrollView
--->LinearLayout
但实际上我有这样的等级制度:

SwipeRefreshLayout
->NestedScrollView
-->LinearLayout
SwipeRefreshLayout (View itself)
->SwipeRefreshLayout (from Layout)
-->NestedScrollView
--->LinearLayout
所以我所做的是停止刷新我从视图而不是视图本身膨胀的SwipeRefreshLayout。 因此,显而易见的修复方法是从布局文件中删除SwipeRefreshLayout,并相应地管理视图本身

话虽如此,我还是不明白为什么文件上说

通知小部件刷新状态已更改。当刷卡手势触发刷新时,不要调用此选项

这让我对问题所在有了错误的认识


此外,我仍然不太明白为什么这只发生一次,然后在我来回滑动时不会再次发生,如上所述。我认为这是因为视图本身在重新聚焦时没有重新绘制刷新指示器,即使它仍然处于“活动”状态。所以它就在那里,但看不见,只是没有刷新/重画。但我不确定。我不是100%确定这里发生了什么,但我会留下几个问题让你澄清:这一切都是在主线程中发生的吗?你有没有尝试
发布
小部件的状态更改?(思考:
swipeLayout.post{swipeLayout.isRefreshing=false}
您是否尝试在刷卡刷新时调用
enabled=false
?代码似乎在内部调用了“reset()”,这似乎起到了作用。@MartinMarconcini我已经在我的编辑中回答了您的问题。
reset()到底是什么意思
?那是什么函数?我想你已经尝试了我最初能想到的所有功能。我会后退一步,尝试滑动布局并检查其源代码,以确定调用的内容和时间。
reset()
函数在SwipeLayout源代码中…它是在调用swipe.enabled=false时调用的。(可能不是最新版本,但仍然是;说到版本,您使用的滑动布局的版本是什么?请尝试删除NestedScrollView。如果它正常工作,则意味着它与NestedScrollView和SwiperFreshLayout的混合有关。