| page.title=Responding to a Refresh Request |
| |
| trainingnavtop=true |
| @jd:body |
| |
| <div id="tb-wrapper"> |
| <div id="tb"> |
| |
| <!-- table of contents --> |
| <h2>This lesson teaches you to</h2> |
| <ol> |
| <li><a href="#RespondRefresh">Respond to the Refresh Gesture</a></li> |
| <li><a href="#RespondAction">Respond to the Refresh Action</a> |
| </ol> |
| |
| <h2>Sample App</h2> |
| |
| <ul> |
| <li><a href="{@docRoot}samples/SwipeRefreshLayoutBasic/index.html"> |
| SwipeRefreshLayoutBasic</a></li> |
| </ul> |
| |
| |
| </div> |
| </div> |
| |
| <p> |
| This lesson shows you how to update your app when the user requests a manual |
| refresh, whether the user triggers the refresh with a swipe gesture or by |
| using the action bar refresh action. |
| </p> |
| |
| <h2 id="RespondRefresh">Respond to the Refresh Gesture</h2> |
| |
| <p> |
| When the user makes a swipe gesture, the system displays the progress |
| indicator and calls your app's callback method. Your callback method is |
| responsible for actually updating the app's data. |
| </p> |
| |
| <p> |
| To respond to the refresh gesture in your app, implement the {@link |
| android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener} interface and |
| its {@link |
| android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener#onRefresh |
| onRefresh()} method. The {@link |
| android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener#onRefresh |
| onRefresh()} method is invoked when the user performs a swipe gesture. |
| </p> |
| |
| <p> |
| You should put the code for the actual update |
| operation in a separate method, and call that update method from your {@link |
| android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener#onRefresh |
| onRefresh()} implementation. That way, you can use the same update method to |
| perform the update when the user triggers a refresh from the action bar. |
| </p> |
| |
| <p> |
| Your update method calls {@link |
| android.support.v4.widget.SwipeRefreshLayout#setRefreshing |
| setRefreshing(false)} when it has finished updating the data. Calling this |
| method instructs the {@link android.support.v4.widget.SwipeRefreshLayout} to |
| remove the progress indicator and update the view contents. |
| </p> |
| |
| <p> |
| For example, the following code implements {@link |
| android.support.v4.widget.SwipeRefreshLayout.OnRefreshListener#onRefresh |
| onRefresh()} and invokes the method {@code myUpdateOperation()} to update the |
| data displayed by the {@link android.widget.ListView}: |
| </p> |
| |
| <pre>/* |
| * Sets up a SwipeRefreshLayout.OnRefreshListener that is invoked when the user |
| * performs a swipe-to-refresh gesture. |
| */ |
| mySwipeRefreshLayout.setOnRefreshListener( |
| new SwipeRefreshLayout.OnRefreshListener() { |
| @Override |
| public void onRefresh() { |
| Log.i(LOG_TAG, "onRefresh called from SwipeRefreshLayout"); |
| |
| // This method performs the actual data-refresh operation. |
| // The method calls setRefreshing(false) when it's finished. |
| myUpdateOperation(); |
| } |
| } |
| );</pre> |
| |
| <h2 id="RespondAction">Respond to the Refresh Action</h2> |
| |
| <p> |
| If the user requests a refresh by using the action bar, the system calls the |
| {@link android.support.v4.app.Fragment#onOptionsItemSelected |
| onOptionsItemSelected()} method. Your app should respond to this call by |
| displaying the progress indicator and refreshing the app's data. |
| </p> |
| |
| <p> |
| To respond to the refresh action, override {@link |
| android.support.v4.app.Fragment#onOptionsItemSelected |
| onOptionsItemSelected()}. In your override method, trigger the {@link |
| android.support.v4.widget.SwipeRefreshLayout} progress indicator by calling |
| {@link android.support.v4.widget.SwipeRefreshLayout#setRefreshing |
| setRefreshing()} with the value {@code true}, then perform the update |
| operation. Once again, you should be doing the actual update in a separate |
| method, so the same method can be called whether the user triggers the update |
| with a swipe or by using the action bar. When the update has finished, call |
| {@link android.support.v4.widget.SwipeRefreshLayout#setRefreshing |
| setRefreshing(false)} to remove the refresh progress indicator. |
| </p> |
| |
| <p>The following code shows how to respond to the request action: |
| </p> |
| |
| <pre>/* |
| * Listen for option item selections so that we receive a notification |
| * when the user requests a refresh by selecting the refresh action bar item. |
| */ |
| @Override |
| public boolean onOptionsItemSelected(MenuItem item) { |
| switch (item.getItemId()) { |
| |
| // Check if user triggered a refresh: |
| case R.id.menu_refresh: |
| Log.i(LOG_TAG, "Refresh menu item selected"); |
| |
| // Signal SwipeRefreshLayout to start the progress indicator |
| mySwipeRefreshLayout.setRefreshing(true); |
| |
| // Start the refresh background task. |
| // This method calls setRefreshing(false) when it's finished. |
| myUpdateOperation(); |
| |
| return true; |
| } |
| |
| // User didn't trigger a refresh, let the superclass handle this action |
| return super.onOptionsItemSelected(item); |
| |
| }</pre> |
| |
| <p class="note"> |
| <strong>Note:</strong> When the user triggers a refresh with a swipe action as |
| described in <a href="#RespondRefresh">Respond to the Refresh Gesture</a>, |
| you do not need to call {@link |
| android.support.v4.widget.SwipeRefreshLayout#setRefreshing setRefreshing()}. |
| The {@link |
| android.support.v4.widget.SwipeRefreshLayout} widget takes care of displaying |
| the progress indicator and removing it when the update has finished. However, |
| if the update is triggered by any means <em>other than</em> a swipe gesture, |
| you need to explicitly turn the progress indicator on with {@link |
| android.support.v4.widget.SwipeRefreshLayout#setRefreshing setRefreshing()}. |
| The method which actually refreshes the data calls {@link |
| android.support.v4.widget.SwipeRefreshLayout#setRefreshing |
| setRefreshing(false)} to signal that the update is finished. |
| </p> |