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がちょっと・・・。