| /* |
| * 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) |
| |
| /** |
| * Dummy {@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); |
| } |
| |
| } |
| } |