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秒間プログレスが表示されるよ
}
}
あわせて読みたい