Android Support Library, revision 19.1.0 で SwipeRefreshLayout が追加されました。
SwipeRefreshLayout とは、下方向のスワイプジェスチャーを検出してプログレスを表示するためのもので、
アプリの情報更新手段として使用できます。
類似の機能は、これまでは各アプリ独自に実装していたと思いますが、Support Library を使用することで、簡単に使用できます。
SwipeRefreshLayout
使い方
1. SwipeRefreshLayout#setOnRefreshListener() を呼び出し、スワイプ時のリスナを登録する
2. スワイプ時に呼び出されるリスナ SwipeRefreshLayout.OnRefreshListener#onRefresh() で更新中の処理を行う
3. 更新後、SwipeRefreshLayout#setRefreshing(false) でプログレスを終了させる
※a. SwipeRefreshLayout#setRefreshing(true) を呼び出す事で、メニューアイテム押下時など、
スワイプ以外の任意のトリガでもプログレスを開始できる
※b. SwipeRefreshLayout#setColorScheme() を呼び出す事で、プログレスの色もカスタマイズできます
サンプル
サンプルアプリは、sdk / extras / android / support / samples / Support4Demos にありました(上記動画)。
以下、Support4Demos 内のソースコード(Apache License, Version 2.0)の抜粋です。
サンプルリソース(swipe_refresh_widget_sample.xml)
<android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_refresh_widget" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/content"/> </android.support.v4.widget.SwipeRefreshLayout>
サンプルソースコード(SwipeRefreshLayoutActivity.java)
public class SwipeRefreshLayoutActivity extends Activity implements OnRefreshListener { public static final String[] TITLES = { "Henry IV (1)", "Henry V", ・・・省略・・・ "Othello", "King Lear" }; private SwipeRefreshLayout mSwipeRefreshWidget; private ListView mList; private Handler mHandler = new Handler(); private final Runnable mRefreshDone = new Runnable() { @Override public void run() { // 3. プログレスを終了させる mSwipeRefreshWidget.setRefreshing(false); } }; @Override public void onCreate(Bundle bundle) { super.onCreate(bundle); setContentView(R.layout.swipe_refresh_widget_sample); mSwipeRefreshWidget = (SwipeRefreshLayout) findViewById(R.id.swipe_refresh_widget); mSwipeRefreshWidget.setColorScheme(R.color.color1, R.color.color2, R.color.color3, R.color.color4); mList = (ListView) findViewById(R.id.content); ArrayAdapter<String> arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, android.R.id.text1, TITLES); mList.setAdapter(arrayAdapter); // 1. スワイプ時のリスナを登録する(implements OnRefreshListener) mSwipeRefreshWidget.setOnRefreshListener(this); } @Override public void onRefresh() { // 2. スワイプ時に呼び出される、ここで更新中の処理を行う refresh(); } @Override public boolean onCreateOptionsMenu(Menu menu) { MenuInflater inflater = getMenuInflater(); inflater.inflate(R.menu.swipe_refresh_menu, menu); return true; } /** * Click handler for the menu item to force a refresh. */ @Override public boolean onOptionsItemSelected(MenuItem item) { final int id = item.getItemId(); switch(id) { case R.id.force_refresh: // a. メニューアイテム押下時など、スワイプ以外の任意のトリガでもプログレスを開始できる mSwipeRefreshWidget.setRefreshing(true); refresh(); return true; } return false; } private void refresh() { // このアプリでは更新処理のダミーとして1秒後に更新終了処理を呼び出している mHandler.removeCallbacks(mRefreshDone); mHandler.postDelayed(mRefreshDone, 1000); // 3000にすると3秒間プログレスが表示されるよ } }
あわせて読みたい