SwipeRefreshLayout: 下拉刷新进度动画

14

我对Android开发非常新手,正在探索谷歌网站上的示例代码。我目前使用的代码是SwipeRefreshLayout:http://developer.android.com/samples/SwipeRefreshLayoutBasic/index.html

在这段代码中,我们看到SwipeRefreshLayout被用于一个列表视图,换句话说,如果你向下拖动列表视图,该方法将被触发,列表视图将自动刷新。

<android.support.v4.widget.SwipeRefreshLayout
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:id="@+id/swiperefresh"
      android:layout_width="match_parent"
      android:layout_height="match_parent">

    <ListView
          android:id="@android:id/list"
          android:layout_width="match_parent"
          android:layout_height="match_parent" />

</android.support.v4.widget.SwipeRefreshLayout>

我感到困惑的是当你向下拖动ListView时,在顶部显示的进度动画条在代码中没有布局。你认为SwipeRefreshLayout会自动生成进度动画条,而不需要用户在xml中指定任何布局吗?
例如,如果想在进度动画条的两端放置填充,以便在刷新时动画不触摸屏幕的两端,该怎么办? https://developer.android.com/reference/android/support/v4/widget/SwipeRefreshLayout.html并没有提到这方面的内容。
2个回答

25

您无法更改动画。

SwipeRefreshLayout 中,您无法自定义太多内容;我认为这是谷歌试图让开发人员坚持常见模式的尝试。您可以设置四种动画颜色,使用 setColorScheme() 指定。

SwipeRefreshLayout 会在顶部显示其预定义的动画。当 canChildScrollUp() 返回 false 并且用户 '向下拉' 时,或者当您设置 setRefreshing(true) 时,它会出现。使用 setRefreshing(false) 关闭动画。在侦听器的方法 onRefreshing() 中放置您的逻辑。如果在您的 SwipeRefreshLayout 中放置的不是 ListView,请覆盖 canChildScrollUp() 。从这里开始,您应该可以运行了。


谢谢。我认为你是对的,除了设置进度条的颜色之外,没有太多可以自定义的东西。你是否知道SwipeRefreshLayout类是否会自动执行notifyDataChanged()方法来刷新listview?当用户通过mListAdapter.add(cheese)方法在listview上拉下后,listview会在3秒钟后自动刷新,但是notifyDataChanged()方法从未被调用以通知listview其数据的更改。 - Simon
дёҚпәЊе®ѓе№¶жІҰжњ‰гЂ‚ж‚ЁеЏҮд»ӨжӘЂжџӨд»Әз ЃпәЊжђњзөұж‚Ёзљ„sdkз›®еҢ•дё­зљ„SwipeRefreshLayout.java文件。您需要安иӘ…ж”ҮжЊЃv4еғ“зљ„жњЂж–°дү®и®ұ版пә€rev 19.1.0пә‰зљ„жғђд»Әз ЃгЂ‚ - Gil Vegliach
所以我猜测ListView会自动刷新,从适配器中添加数据:mListAdapter.add(cheese)? - Simon
mListAdapter 是什么类型?无论如何,我认为你最好问一个全新的问题。 - Gil Vegliach

12

虽然你无法改变它,但你仍然可以将其隐藏,然后在触发时显示自己的内容 :-)

SwipeRefreshLayout swiperefresh = (SwipeRefreshLayout)root.findViewById(R.id.swiperefresh);
swiperefresh.setOnRefreshListener(this);
swiperefresh.setColorSchemeColors(0,0,0,0);
swiperefresh.setProgressBackgroundColor(android.R.color.transparent); 

注意:

  • 在Eclipse中,您需要添加@SuppressLint("ResourceAsColor")才能编译此代码。

  • 在适当的时间点仍需调用setRefreshing(false),否则onRefresh将不会再次触发。


setProgressBackgroundColor(android.R.color.transparent)已被弃用。请改用swiperefresh.setProgressBackgroundColorSchemeResource(android.R.color.transparent);。 - user2301281
这个不再起作用了。然而,我从这个问题中发现将视图的alpha更新为0就可以解决问题。 - rickchristie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接