【发布时间】: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 设置为带有TabLayout 的ViewPager。 SwipeRefreshLayout 仅在第一页上。现在,当我第一次刷新它时,刷新指示器不会消失。但是当我将页面切换到最后一页然后再回到第一页并刷新时,刷新指示器在完成后消失了。
基本上
- 已选择第 1 页
- 拉动手势
- 第 1 页已刷新,刷新指示器没有消失
- 已选择第 5 页
- 已选择第 1 页,刷新指示器消失了
- 拉动手势
- 第 1 页刷新,刷新指示器消失
我不太了解这种行为,希望得到任何帮助以找出这里出了什么问题。我认为我不会通过页面切换来改变任何应该改变SwipeRefreshLayout 行为的东西,但不知何故它确实如此。
编辑
回答cmets中的问题:
- 这一切都发生在主线程中吗?
- loadData 启动一个新线程。在该线程中,我通过
runOnUiThread在主线程中执行某些操作,当然如上所示,回调也是runOnUiThread
- loadData 启动一个新线程。在该线程中,我通过
- 您是否尝试将状态更改发布到小部件? (想想: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