質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Q&A

解決済

1回答

10172閲覧

PagerAdapterのinstantiateItemの働きについて

Knsk

総合スコア22

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Android

Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

0グッド

0クリップ

投稿2015/03/04 08:31

お世話になっております。

標題ついて、instantiateItem()がどういったタイミングで働いているのかが分かりません。
PagerAdapterを継承したAdapterを下記のように実装しました。

lang

1private class MyPagerAdapter extends PagerAdapter { 2 3 LayoutInflater inflater = null; 4 5 //コンストラクタ 6 private MyPagerAdapter(Context context) { 7 super(); 8 inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 9 } 10 11 public int getCount(){ 12 return NUM_OF_VIEWS; 13 } 14 15 16 @Override 17 public Object instantiateItem(ViewGroup container, int position){ 18 19 LinearLayout mLayout = (LinearLayout)inflater.inflate(R.layout.monthly_cal, null); 20 21 /*生成したLayoutに対する処理*/ 22 23 container.addView(linearLayout); 24 return mLayout; 25 } 26 27 @Override 28 public void destroyItem(ViewGroup container, int position, Object object) { 29 ((ViewPager)container).removeView((View)object); 30 } 31 32 @Override 33 public boolean isViewFromObject(View view, Object object) { 34 return view.equals(object); 35 } 36 } 37 38}

MainActivityでこれをnewし、ViewPagerに格納して
きちんとNUM_OF_VIEWSの数だけページの生成には成功しています。

しかし、その中のinstantiateItem()がどのタイミングで動いているのかが分かりません。
newをしているので、Adapterのコンストラクタになっていたり、

lang

1MyPagerAdapter mAdapter = new MyPagerAdapter(this); 2LinearLayout ll = mAdapter.instantiateItem(container, position);

で呼ばれるといった形であれば理解できるのですが...
おそらく、このメソッドに限ったことではないと思うのですが
何故new&setAdapterしただけでViewが生成されるのか教えていただきたいです。
かなり初歩的なことかもしれませんが、よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

おおざっぱに書くと、以下のようになります。

1.ViewPagerが画面上に何かを表示する必要が発生する
2.instantiateItemを呼び出して、ViewPagerが管理するレイアウトにユーザーが何かしらpositionに対応するUIパーツを追加するように要求する
3.ViewPagerはユーザーがViewを追加し終わった管理レイアウトを画面に表示する
4.もういらないと判断したUIパーツは、destoryItemで、ユーザーに破棄しろと通知する

厳密には、画面に表示されなくても、裏でキャッシュする機能もあったりしますが、基本的にいつ呼び出されるかは気にしないでよい、というか、そのタイミングに依存して書くようなロジックは奨励されません。

投稿2015/03/30 17:08

terushu

総合スコア358

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Knsk

2015/03/31 02:55

>呼び出されるタイミングに依存したロジックは奨励されない メソッドによってはこういう場合もあるのですね。為になりました。 ご回答ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問