SwipeRefreshLayout组件只接受一个子组件:即需要刷新的那个组件。它使用一个侦听机制来通知拥有该组件的监听器有刷新事件发生,换句话说我们的Activity必须实现通知的接口。该Activity负责处理事件刷新和刷新相应的视图。一旦监听者接收到该事件,就决定了刷新过程中应处理的地方。如果要展示一个“刷新动画”,它必须调用setRefrshing(true)
,否则取消动画就调用setRefreshing(false)
。
怎样使用SwipeRefreshLayout
<
android.support.v4.widget.SwipeRefreshLayout
android:layout_width
=
"match_parent"
android:layout_height
=
"match_parent"
xmlns:android
=
"http://schemas.android.com/apk/res/android"
android:paddingLeft
=
"@dimen/activity_horizontal_margin"
android:paddingRight
=
"@dimen/activity_horizontal_margin"
android:paddingTop
=
"@dimen/activity_vertical_margin"
android:paddingBottom
=
"@dimen/activity_vertical_margin"
android:id
=
"@+id/swipe"
>
……
</
android.support.v4.widget.SwipeRefreshLayout
>
protected
void
onCreate(Bundle savedInstanceState) {
super
.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
final
SwipeRefreshLayout swipeView = (SwipeRefreshLayout) findViewById(R.id.swipe);
final
TextView rndNum = (TextView) findViewById(R.id.rndNum);
swipeView.setColorScheme(android.R.color.holo_blue_dark, android.R.color.holo_blue_light, android.R.color.holo_green_light, android.R.color.holo_green_light);
swipeView.setOnRefreshListener(
new
SwipeRefreshLayout.OnRefreshListener() {
@Override
public
void
onRefresh() {
swipeView.setRefreshing(
true
);
Log.d(
"Swipe"
,
"Refreshing Number"
);
(
new
Handler()).postDelayed(
new
Runnable() {
@Override
public
void
run() {
swipeView.setRefreshing(
false
);
double
f = Math.random();
rndNum.setText(String.valueOf(f));
}
},
3000
);
}
});
}
在ListView上使用SwipeRefreshLayout
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/sample_main_layout"> <ViewAnimator android:id="@+id/sample_output" android:layout_width="match_parent" android:layout_height="0px" android:layout_weight="1"> <ScrollView style="@style/Widget.SampleMessageTile" android:layout_width="match_parent" android:layout_height="match_parent"> <TextView style="@style/Widget.SampleMessage" android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="@dimen/horizontal_page_margin" android:paddingRight="@dimen/horizontal_page_margin" android:paddingTop="@dimen/vertical_page_margin" android:paddingBottom="@dimen/vertical_page_margin" android:text="@string/intro_message" /> </ScrollView> <fragment android:name="com.example.android.common.logger.LogFragment" android:id="@+id/log_fragment" android:layout_width="match_parent" android:layout_height="match_parent" /> </ViewAnimator> <View android:layout_width="match_parent" android:layout_height="1dp" android:background="@android:color/darker_gray" /> <FrameLayout android:id="@+id/sample_content_fragment" android:layout_weight="2" android:layout_width="match_parent" android:layout_height="0px" /> </LinearLayout>
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); } } }
protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); if (savedInstanceState == null) { FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); SwipeRefreshLayoutBasicFragment fragment = new SwipeRefreshLayoutBasicFragment(); transaction.replace(R.id.sample_content_fragment, fragment); transaction.commit(); } }