Using SwipeRefreshLayout
SwipeRefreshLayout is a ViewGroup that can hold only one scrollable view as a child. This can be either a
ScrollView
or an AdapterView
such as a ListView
or a RecyclerView
.
Note: This layout only exists within more recent versions of support-v4 as explained in this post. Edit your
app/build.gradle
file to include a support library later than version 19:apply plugin: 'com.android.application'
//...
dependencies {
// ...
compile 'com.android.support:support-v4:24.2.1'
}
Make sure your support library is up to date through the Android Studio SDK Manager:
- Open the SDK Manager from Android Studio with Tools -> Android -> SDK Manager
- The support library is under "Extras"
Once you have a recent version support library installed (v22 or higher), then we can safely continue.
ListView with SwipeRefreshLayout
Step 1: Wrap ListView
We can use this by first wrapping the scrollable view with a
SwipeRefreshLayout
in the XML layout:<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipeContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/lvItems"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" >
</ListView>
</android.support.v4.widget.SwipeRefreshLayout>
Step 2: Setup SwipeRefreshLayout
Next, we need to configure the
SwipeRefreshLayout
during view initialization in the activity:public class TimelineActivity extends Activity {
private SwipeRefreshLayout swipeContainer;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// Only ever call `setContentView` once right at the top
setContentView(R.layout.activity_main);
// Lookup the swipe container view
swipeContainer = (SwipeRefreshLayout) findViewById(R.id.swipeContainer);
// Setup refresh listener which triggers new data loading
swipeContainer.setOnRefreshListener(new OnRefreshListener() {
@Override
public void onRefresh() {
// Your code to refresh the list here.
// Make sure you call swipeContainer.setRefreshing(false)
// once the network request has completed successfully.
fetchTimelineAsync(0);
}
});
// Configure the refreshing colors
swipeContainer.setColorSchemeResources(android.R.color.holo_blue_bright,
android.R.color.holo_green_light,
android.R.color.holo_orange_light,
android.R.color.holo_red_light);
}
public void fetchTimelineAsync(int page) {
// Send the network request to fetch the updated data
// `client` here is an instance of Android Async HTTP
// getHomeTimeline is an example endpoint.
client.getHomeTimeline(0, new JsonHttpResponseHandler() {
public void onSuccess(JSONArray json) {
// Remember to CLEAR OUT old items before appending in the new ones
adapter.clear();
// ...the data has come back, add new items to your adapter...
adapter.addAll(...);
// Now we call setRefreshing(false) to signal refresh has finished
swipeContainer.setRefreshing(false);
}
public void onFailure(Throwable e) {
Log.d("DEBUG", "Fetch timeline error: " + e.toString());
}
});
}
}
Note that upon successful reload, we must also signal that the refresh has completed by calling
setRefreshing(false)
. Also note that you should clear out old items before appending the new ones during a refresh.
Having issues? Be sure to check out the troubleshooting tips if you are running into issues with swipe to refresh.
RecyclerView with SwipeRefreshLayout
Step 1: Wrap RecyclerView
Just like the previous section, wrap the scrollable view, in this case a
RecyclerView
with a SwipeRefreshLayout
in the XML layout:<android.support.v4.widget.SwipeRefreshLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/swipeContainer"
android:layout_width="match_parent"
android:layout_height="match_parent">
<android.support.v7.widget.RecyclerView
android:id="@+id/rvItems"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_alignParentLeft="true"
android:layout_alignParentTop="true" />
</android.support.v4.widget.SwipeRefreshLayout>
Step 2: Update RecyclerView.Adapter
Make sure to have helper methods in your
RecyclerView
adapter to clear items from the underlying dataset or add items to it./* Within the RecyclerView.Adapter class */
// Clean all elements of the recycler
public void clear() {
items.clear();
notifyDataSetChanged();
}
// Add a list of items
public void addAll(List<list> list) {
items.addAll(list);
notifyDataSetChanged();
}
0 comments:
Post a Comment