我正在使用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
一起设置为TabLayout
。 SwipeRefreshLayout
仅在第一页上。现在,当我第一次刷新它时,刷新指示器不会消失。但是,当我将页面切换到最后一页然后又回到第一页并刷新时,刷新指示符在完成后消失。
基本上如此
我不太了解这种行为,希望对这里的问题有所帮助。我不认为我可以通过页面切换来更改SwipeRefreshLayout
的行为,但是以某种方式可以改变。
编辑
回答评论中的问题:
runOnUiThread
在主线程中执行了某些操作,当然,如上图所示,回调也是runOnUiThread
编辑2
我刚刚注意到,虽然发生此错误,但我可以继续滑动。当第一个刷新指示器仍保持在原位时,第二个刷新指示器将出现并根据需要消失。
好像我有一些基本知识是错误的,或者至少是对我的活动/布局/视图的构建有错误的理解。