Horizontal View Swiping with ViewPager

ちょっとほったらかしにしていたネタを掘り起こしてみます。以前こちらで書いたネタです。以前の記事では実行するまでに止まりましたが、今回はちょっと中身を除いてみることにします。


このサンプルではViewPagerというクラスが使われています。このViewPagerですが、Android Developersで検索してもリファレンスが出てきません。理由は分かりませんが、おそらくこのViewPagerクラスがCompatibility Packageだからではないかと予想します。Compatibility PackageとはHoneyComb向けにリリースされたFragmentをAndroid3.0以前でも使えるようにするためのパッケージです。もちろんこのサンプルでもCompatibility Packageを使っています。

でも何でリファレンスがないんでしょう?ソースを見ろってことなんでしょうかね。


まぁそんなことはさておき、このサンプルでやっていることはとってもシンプルです。要の部分はこちら。

private AwesomePagerAdapter awesomeAdapter;

// 省略

awesomeAdapter = new AwesomePagerAdapter();
awesomePager = (ViewPager) findViewById(R.id.awesomepager);
awesomePager.setAdapter(awesomeAdapter);


あれれ?何か見たことあるパターンですよね。そうです、リストにアダプタを差し込むパターンとまったく同じです。つまりページにアダプタを差し込むわけです。後はViewPagerが必要なときに必要なページをアダプタに問い合わせてくるわけです。う〜ん、見事なアナロジー♪


では肝心なアダプタ (PagerAdapter) 側のコードを見てみます。オーバーライドすべきメソッドは以下の8つです。

メソッド名 説明
int getCount() ページの数を返す
Object instantiateItem(View collection, int position) position番目のViewをViewPagerに追加する
void destroyItem(View collection, int position, Object view) position番目のViewをViewPagerから削除する
boolean isViewFromObject(View view, Object object) ???
void finishUpdate(View arg0) Viewが切り替わったタイミングで呼ばれる
void restoreState(Parcelable arg0, ClassLoader arg1) 状態を復帰するためのメソッド
Parcelable saveState() 状態を保存するためのメソッド
void startUpdate(View arg0) Viewの切り替わりが始まるタイミングで呼ばれる


よく分からないのがisViewFromObject。ログで確認したところ、かなりの回数呼ばれています。サンプルの中身はこんな感じ。

@Override
public boolean isViewFromObject(View view, Object object) {
    return view==((TextView)object);
}


???よう分からん。まぁいいか (オイオイ) 。


こちらのブログにもあるように、欠点は各ページごとに状態を覚える必要がある場合、なんらかの仕掛けを自分で仕込まないといけない点ですね。ちなみにsaveState、restoreStateはViewが切り替わるごとに呼ばれるのではなく、ViewPager全体がバックグラウンドに遷移したり、フォアグラウンドに遷移したりするときに呼ばれます。


以上、ViewPagerのサンプルについて見てきましたが、個人的な感想を言うと使えないかなぁ〜です。ViewPagerそのものもそんなに使い勝手がよい感じではありませんが、何よりもCompatibility Packageがちょっと・・・。