【问题标题】:Stop SwipeRefreshLayout refresh animation, despite setRefresh(false)/isRefreshing=false停止 SwipeRefreshLayout 刷新动画,尽管 setRefresh(false)/isRefreshing=false
【发布时间】:2019-09-13 08:50:11
【问题描述】:

我正在使用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 的文档指出:

通知小部件刷新状态已更改。当刷新由滑动手势触发时不要调用它。

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

现在是复杂的部分:

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

基本上

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

我不太了解这种行为,希望得到任何帮助以找出这里出了什么问题。我认为我不会通过页面切换来改变任何应该改变SwipeRefreshLayout 行为的东西,但不知何故它确实如此。

编辑

回答cmets中的问题:

  • 这一切都发生在主线程中吗?
    • loadData 启动一个新线程。在该线程中,我通过runOnUiThread 在主线程中执行某些操作,当然如上所示,回调也是runOnUiThread
  • 您是否尝试将状态更改发布到小部件? (想想:swipeLayout.post { swipeLayout.isRefreshing = false }
    • 是的,我试过postDelayed,有1000ms和5000ms
  • 您是否尝试在滑动刷新时调用 enabled = false?
    • 是的,而且基本上发生了同样的事情。刷新指示器保持在原来的位置。当我按上述方式切换页面并尝试再次刷新时,它根本无法正常工作,正如预期的那样。

编辑 2

我刚刚注意到,虽然发生此错误,但我可以继续刷卡。虽然第一个刷新指示器仍然保持原位,但它后面的第二个刷新指示器会按原样出现和消失。

【问题讨论】:

  • 我不是 100% 确定这里发生了什么,但我会留下几个问题供您澄清:这一切都发生在主线程中吗?您是否尝试将post 状态更改为小部件? (想想:swipeLayout.post { swipeLayout.isRefreshing = false } 您是否尝试在刷卡刷新时调用enabled = false?代码似乎在内部调用“reset()”......这似乎可以解决问题。
  • @MartinMarconcini 我已经在我的编辑中回答了你的问题。 reset() 到底是什么意思?那是什么功能?
  • 我想你已经尝试了我最初能想到的一切。我会退后一步,尝试滑动布局并检查其源代码以确定调用的内容和时间。 reset() 函数在 SwipeLayout 源代码中......当调用 swipe.enabled = false 时调用它。 check the source code(可能不是最新版本,但仍然;说到版本,您使用的是哪个版本的滑动布局?
  • 尝试移除 NestedScrollView。如果它正在工作,则意味着它与 NestedScrollView 和 SwipeRefreshLayout 的混合有关。

标签: java android android-layout kotlin swiperefreshlayout


【解决方案1】:

看起来我有一些基本错误,或者至少对我的活动/布局/视图的构建方式有错误的理解。

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

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

我让布局膨胀的自定义视图本身就是一个 SwipeRefreshLayout。所以我认为我有这个层次结构:

SwipeRefreshLayout
->NestedScrollView
-->LinearLayout

但我实际上有这个层次结构:

SwipeRefreshLayout (View itself)
->SwipeRefreshLayout (from Layout)
-->NestedScrollView
--->LinearLayout

所以我所做的是停止刷新我从视图中膨胀的 SwipeRefreshLayout,而不是视图本身。 所以显而易见的解决方法是从布局文件中删除 SwipeRefreshLayout 并相应地管理视图本身。

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

通知小部件刷新状态已更改。当刷新由滑动手势触发时不要调用它。

这让我对问题出在哪里产生了错误的认识。

另外,我仍然不太明白为什么这种情况只发生一次,然后在我来回滑动时不再发生,如上所述。我假设这是因为视图本身在重新聚焦时并没有重绘刷新指示器,即使它仍然是“活动的”。所以它在那里但不可见,只是没有刷新/重绘。不过不确定。

【讨论】:

    猜你喜欢
    • 2015-08-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-22
    • 1970-01-01
    • 2016-02-22
    • 1970-01-01
    相关资源
    最近更新 更多