我正在使用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
仅在第一页上。现在,当我第一次刷新它时,刷新指示器不会消失。但是,当我将页面切换到最后一页然后又回到第一页并刷新时,刷新指示符在完成后消失。
所以基本上
我不太了解这种行为,希望对这里的问题有任何帮助。我不认为我可以通过页面切换来更改SwipeRefreshLayout
的行为,但可以改变它。
编辑
回答评论中的问题:
SwipeRefreshLayout
在主线程中执行了某些操作,当然,如上图所示,回调也是runOnUiThread
编辑2
我刚刚注意到,虽然发生此错误,但我可以继续刷卡。在第一个刷新指示器仍保持原位的同时,后面的第二个刷新指示器则出现并消失了。
答案 0 :(得分:0)
看起来我的基本知识是错误的,或者至少是对我的活动/布局/视图的构建方式有错误的理解。
加载指示器没有消失的原因是,它确实消失了。其中一个至少做了。
我以为我有一个SwipeRefreshLayout,但是实际上有两个!但是我只停用了其中之一。
我放大了版式的自定义视图本身就是SwipeRefreshLayout。所以我以为我有这样的等级制度:
SwipeRefreshLayout
->NestedScrollView
-->LinearLayout
但是我实际上有这个层次结构:
SwipeRefreshLayout (View itself)
->SwipeRefreshLayout (from Layout)
-->NestedScrollView
--->LinearLayout
所以我要做的是停止刷新从视图(而不是视图本身)放大的SwipeRefreshLayout。 因此,明显的解决方法是从布局文件中删除SwipeRefreshLayout并相应地管理视图本身。
话虽如此,我仍然不明白为什么文档说
通知窗口小部件刷新状态已更改。当滑动手势触发刷新时,请勿调用此方法。
这让我对问题的根源有错误的认识。
而且,如上所述,我仍然不太了解为什么这种情况只发生一次,然后又来回滑动时又没有发生。我假设是因为视图本身在重新聚焦时并未重绘刷新指示器,即使它仍然处于“活动”状态。因此它在那里但不可见,只是没有刷新/重绘。不过不确定。