尽管setRefresh(false)/ isRefreshing = false

时间:2019-09-13 08:50:11

标签: 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/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设置为带有ViewPager的{​​{1}}。 TabLayout仅在第一页上。现在,当我第一次刷新它时,刷新指示器不会消失。但是,当我将页面切换到最后一页然后又回到第一页并刷新时,刷新指示符在完成后消失。

所以基本上

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

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

编辑

回答评论中的问题:

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

编辑2

我刚刚注意到,虽然发生此错误,但我可以继续刷卡。在第一个刷新指示器仍保持原位的同时,后面的第二个刷新指示器则出现并消失了。

1 个答案:

答案 0 :(得分:0)

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

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

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

我放大了版式的自定义视图本身就是SwipeRefreshLayout。所以我以为我有这样的等级制度:

SwipeRefreshLayout
->NestedScrollView
-->LinearLayout

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

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

所以我要做的是停止刷新从视图(而不是视图本身)放大的SwipeRefreshLayout。 因此,明显的解决方法是从布局文件中删除SwipeRefreshLayout并相应地管理视图本身。

话虽如此,我仍然不明白为什么文档说

  

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

这让我对问题的根源有错误的认识。

而且,如上所述,我仍然不太了解为什么这种情况只发生一次,然后又来回滑动时又没有发生。我假设是因为视图本身在重新聚焦时并未重绘刷新指示器,即使它仍然处于“活动”状态。因此它在那里但不可见,只是没有刷新/重绘。不过不确定。

相关问题