| /* | |
| * Copyright 2014 The Android Open Source Project | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| package com.example.android.swiperefreshlayoutbasic; | |
| import com.example.android.common.dummydata.Cheeses; | |
| import com.example.android.common.logger.Log; | |
| import android.os.AsyncTask; | |
| import android.os.Bundle; | |
| import android.support.v4.app.Fragment; | |
| import android.support.v4.widget.SwipeRefreshLayout; | |
| import android.view.LayoutInflater; | |
| import android.view.Menu; | |
| import android.view.MenuInflater; | |
| import android.view.MenuItem; | |
| import android.view.View; | |
| import android.view.ViewGroup; | |
| import android.widget.ArrayAdapter; | |
| import android.widget.ListView; | |
| import java.util.List; | |
| /** | |
| * A basic sample that shows how to use {@link android.support.v4.widget.SwipeRefreshLayout} to add | |
| * the 'swipe-to-refresh' gesture to a layout. In this sample, SwipeRefreshLayout contains a | |
| * scrollable {@link android.widget.ListView} as its only child. | |
| * | |
| * <p>To provide an accessible way to trigger the refresh, this app also provides a refresh | |
| * action item. | |
| * | |
| * <p>In this sample app, the refresh updates the ListView with a random set of new items. | |
| */ | |
| public class SwipeRefreshLayoutBasicFragment extends Fragment { | |
| private static final String LOG_TAG = SwipeRefreshLayoutBasicFragment.class.getSimpleName(); | |
| private static final int LIST_ITEM_COUNT = 20; | |
| /** | |
| * The {@link android.support.v4.widget.SwipeRefreshLayout} that detects swipe gestures and | |
| * triggers callbacks in the app. | |
| */ | |
| private SwipeRefreshLayout mSwipeRefreshLayout; | |
| /** | |
| * The {@link android.widget.ListView} that displays the content that should be refreshed. | |
| */ | |
| private ListView mListView; | |
| /** | |
| * The {@link android.widget.ListAdapter} used to populate the {@link android.widget.ListView} | |
| * defined in the previous statement. | |
| */ | |
| private ArrayAdapter<String> mListAdapter; | |
| @Override | |
| public void onCreate(Bundle savedInstanceState) { | |
| super.onCreate(savedInstanceState); | |
| // Notify the system to allow an options menu for this fragment. | |
| setHasOptionsMenu(true); | |
| } | |
| // BEGIN_INCLUDE (inflate_view) | |
| @Override | |
| public View onCreateView(LayoutInflater inflater, ViewGroup container, | |
| Bundle savedInstanceState) { | |
| View view = inflater.inflate(R.layout.fragment_sample, container, false); | |
| // Retrieve the SwipeRefreshLayout and ListView instances | |
| mSwipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swiperefresh); | |
| // BEGIN_INCLUDE (change_colors) | |
| // Set the color scheme of the SwipeRefreshLayout by providing 4 color resource ids | |
| mSwipeRefreshLayout.setColorScheme( | |
| R.color.swipe_color_1, R.color.swipe_color_2, | |
| R.color.swipe_color_3, R.color.swipe_color_4); | |
| // END_INCLUDE (change_colors) | |
| // Retrieve the ListView | |
| mListView = (ListView) view.findViewById(android.R.id.list); | |
| return view; | |
| } | |
| // END_INCLUDE (inflate_view) | |
| // BEGIN_INCLUDE (setup_views) | |
| @Override | |
| public void onViewCreated(View view, Bundle savedInstanceState) { | |
| super.onViewCreated(view, savedInstanceState); | |
| /** | |
| * Create an ArrayAdapter to contain the data for the ListView. Each item in the ListView | |
| * uses the system-defined simple_list_item_1 layout that contains one TextView. | |
| */ | |
| mListAdapter = new ArrayAdapter<String>( | |
| getActivity(), | |
| android.R.layout.simple_list_item_1, | |
| android.R.id.text1, | |
| Cheeses.randomList(LIST_ITEM_COUNT)); | |
| // Set the adapter between the ListView and its backing data. | |
| mListView.setAdapter(mListAdapter); | |
| // BEGIN_INCLUDE (setup_refreshlistener) | |
| /** | |
| * Implement {@link SwipeRefreshLayout.OnRefreshListener}. When users do the "swipe to | |
| * refresh" gesture, SwipeRefreshLayout invokes | |
| * {@link SwipeRefreshLayout.OnRefreshListener#onRefresh onRefresh()}. In | |
| * {@link SwipeRefreshLayout.OnRefreshListener#onRefresh onRefresh()}, call a method that | |
| * refreshes the content. Call the same method in response to the Refresh action from the | |
| * action bar. | |
| */ | |
| mSwipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { | |
| @Override | |
| public void onRefresh() { | |
| Log.i(LOG_TAG, "onRefresh called from SwipeRefreshLayout"); | |
| initiateRefresh(); | |
| } | |
| }); | |
| // END_INCLUDE (setup_refreshlistener) | |
| } | |
| // END_INCLUDE (setup_views) | |
| @Override | |
| public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) { | |
| inflater.inflate(R.menu.main_menu, menu); | |
| } | |
| // BEGIN_INCLUDE (setup_refresh_menu_listener) | |
| /** | |
| * Respond to the user's selection of the Refresh action item. Start the SwipeRefreshLayout | |
| * progress bar, then initiate the background task that refreshes the content. | |
| */ | |
| @Override | |
| public boolean onOptionsItemSelected(MenuItem item) { | |
| switch (item.getItemId()) { | |
| case R.id.menu_refresh: | |
| Log.i(LOG_TAG, "Refresh menu item selected"); | |
| // We make sure that the SwipeRefreshLayout is displaying it's refreshing indicator | |
| if (!mSwipeRefreshLayout.isRefreshing()) { | |
| mSwipeRefreshLayout.setRefreshing(true); | |
| } | |
| // Start our refresh background task | |
| initiateRefresh(); | |
| return true; | |
| } | |
| return super.onOptionsItemSelected(item); | |
| } | |
| // END_INCLUDE (setup_refresh_menu_listener) | |
| // BEGIN_INCLUDE (initiate_refresh) | |
| /** | |
| * By abstracting the refresh process to a single method, the app allows both the | |
| * SwipeGestureLayout onRefresh() method and the Refresh action item to refresh the content. | |
| */ | |
| private void initiateRefresh() { | |
| Log.i(LOG_TAG, "initiateRefresh"); | |
| /** | |
| * Execute the background task, which uses {@link android.os.AsyncTask} to load the data. | |
| */ | |
| new DummyBackgroundTask().execute(); | |
| } | |
| // END_INCLUDE (initiate_refresh) | |
| // BEGIN_INCLUDE (refresh_complete) | |
| /** | |
| * When the AsyncTask finishes, it calls onRefreshComplete(), which updates the data in the | |
| * ListAdapter and turns off the progress bar. | |
| */ | |
| private void onRefreshComplete(List<String> result) { | |
| Log.i(LOG_TAG, "onRefreshComplete"); | |
| // Remove all items from the ListAdapter, and then replace them with the new items | |
| mListAdapter.clear(); | |
| for (String cheese : result) { | |
| mListAdapter.add(cheese); | |
| } | |
| // Stop the refreshing indicator | |
| mSwipeRefreshLayout.setRefreshing(false); | |
| } | |
| // END_INCLUDE (refresh_complete) | |
| /** | |
| * Placeholder {@link AsyncTask} which simulates a long running task to fetch new cheeses. | |
| */ | |
| private class DummyBackgroundTask extends AsyncTask<Void, Void, List<String>> { | |
| static final int TASK_DURATION = 3 * 1000; // 3 seconds | |
| @Override | |
| protected List<String> doInBackground(Void... params) { | |
| // Sleep for a small amount of time to simulate a background-task | |
| try { | |
| Thread.sleep(TASK_DURATION); | |
| } catch (InterruptedException e) { | |
| e.printStackTrace(); | |
| } | |
| // Return a new random list of cheeses | |
| return Cheeses.randomList(LIST_ITEM_COUNT); | |
| } | |
| @Override | |
| protected void onPostExecute(List<String> result) { | |
| super.onPostExecute(result); | |
| // Tell the Fragment that the refresh has completed | |
| onRefreshComplete(result); | |
| } | |
| } | |
| } |