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

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

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

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

Android

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

Q&A

解決済

2回答

2290閲覧

ViewPagerのAdapter内のinstantiateItem内でreturnするタイミングを遅らせたい

hanhunhun

総合スコア100

Java

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

Android

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

0グッド

0クリップ

投稿2016/07/15 09:00

編集2016/07/15 09:36

お世話になります。

表題ではわかりづらいかと思いますがPagerAdapterのinstantiateItem内の処理が全て完了したタイミングで値を返したいのですがうまくできません

そもそもこの方法を探し出した経緯がViewPager内5ページの内容をPHPが吐いたXMLを読み込んでそれをパースし、Viewにセットしたいのですが各ページにしっかりとデータは反映するのですがページ表示直後だとViewPagerの1ページ目と2ページ目が表示されません
ViewPagerをスクロールし表示されないページから2ページ離れて再度該当ページに戻るとしっかり表示されるのですが読み込み直後だけ表示されていないのでXMLの読み込みとパースがinstantiateItemのreturnに間に合っていないのかと思い今に至りました
以下ソースです

java

1 public Object instantiateItem(View collection, final int position) { 2 llv = new LinearLayout(mContext); 3 llv.setOrientation(LinearLayout.VERTICAL); 4 gl = (Globals) mContext.getApplicationContext(); 5 6 new Thread(new Runnable(){ 7 @Override 8 public void run(){ 9 try{ 10 URL url = new URL( URL ); 11 Log.d("URL1212",url.toString()); 12 HttpURLConnection con = (HttpURLConnection)url.openConnection(); 13 str = InputStreamToString(con.getInputStream()); 14 Log.d("xml",str); 15 16 }catch (Exception ex){ 17 System.out.println(ex); 18 } 19 20 } 21 }).start(); 22 23 while(str !=null){ 24 //xmlparse開始 25 XmlPullParser xpp = Xml.newPullParser(); 26 try{ 27 xpp.setInput(new StringReader(str)); 28 }catch (XmlPullParserException e){ 29 30 } 31// XML解析 32 try { 33 int eventType; 34 eventType = xpp.getEventType(); 35 36 final LinearLayout llh = new LinearLayout(mContext); 37 llh.setOrientation(LinearLayout.HORIZONTAL); 38 39 while (eventType != xpp.END_DOCUMENT) { 40 if((eventType == xpp.START_TAG)){ 41 if(("DateTitle"+position).equals(xpp.getName())){ 42// llv = new LinearLayout(mContext); 43// llv.setOrientation(LinearLayout.VERTICAL); 44 final TextView tv = new TextView(mContext); 45 final String txt = xpp.nextText(); 46 handler.post(new Runnable() { 47 @Override 48 public void run() { 49 tv.setTextSize(12); 50 tv.setBackgroundColor(Color.parseColor("#d3d3d3")); 51 tv.setText(txt); 52 llh.addView(tv); 53 } 54 }); 55 }else if(("DateData"+position).equals(xpp.getName())){ 56 final TextView tv = new TextView(mContext); 57 final String txt = xpp.nextText(); 58 handler.post(new Runnable() { 59 @Override 60 public void run() { 61 tv.setTextSize(18); 62 tv.setText(txt); 63 llh.addView(tv); 64 llv.addView(llh); 65 } 66 }); 67 } 68 } 69 70 eventType = xpp.next(); 71 } 72 }catch (Exception e){ 73 Log.d("XmlPullParser", String.valueOf(e)); 74 } 75 ((ViewPager) collection).addView(llv,0); 76 //strに値が入ったら1回だけまわってループを脱出 77 break; 78 } 79 return llv; 80 }

知識がなさ過ぎて原因究明もまともにできておりません故他に原因等ございましたらご教授頂けますと幸いでございます

よろしくお願いします

//-------追記---------//

java

1 public Object instantiateItem(View collection, final int position) { 2 llv = new LinearLayout(mContext); 3 llv.setOrientation(LinearLayout.VERTICAL); 4 gl = (Globals) mContext.getApplicationContext(); 5 6 new Thread(new Runnable(){ 7 @Override 8 public void run(){ 9 try{ 10 URL url = new URL("http://153.149.37.82/Eigyo_Test/xml/detail.php?position=" + position + "&search="+ gl.ProspectId +"&comcode=" + gl.ComCode + "&logid=" + gl.tID ); 11 Log.d("URL1212",url.toString()); 12 HttpURLConnection con = (HttpURLConnection)url.openConnection(); 13 String str = InputStreamToString(con.getInputStream()); 14 Log.d("xml",str); 15 16 while(str !=null){ 17 //xmlparse開始 18 XmlPullParser xpp = Xml.newPullParser(); 19 try{ 20 xpp.setInput(new StringReader(str)); 21 }catch (XmlPullParserException e){ 22 23 } 24// XML解析 25 try { 26 int eventType; 27 eventType = xpp.getEventType(); 28 29 final LinearLayout llh = new LinearLayout(mContext); 30 llh.setOrientation(LinearLayout.HORIZONTAL); 31 32 while (eventType != xpp.END_DOCUMENT) { 33 if((eventType == xpp.START_TAG)){ 34 if(("DateTitle"+position).equals(xpp.getName())){ 35// llv = new LinearLayout(mContext); 36// llv.setOrientation(LinearLayout.VERTICAL); 37 final TextView tv = new TextView(mContext); 38 final String txt = xpp.nextText(); 39 handler.post(new Runnable() { 40 @Override 41 public void run() { 42 tv.setTextSize(12); 43 tv.setBackgroundColor(Color.parseColor("#d3d3d3")); 44 tv.setText(txt); 45 llh.addView(tv); 46 } 47 }); 48 }else if(("DateData"+position).equals(xpp.getName())){ 49 final TextView tv = new TextView(mContext); 50 final String txt = xpp.nextText(); 51 handler.post(new Runnable() { 52 @Override 53 public void run() { 54 tv.setTextSize(18); 55 tv.setText(txt); 56 llh.addView(tv); 57 llv.addView(llh); 58 } 59 }); 60 } 61 } 62 63 eventType = xpp.next(); 64 } 65 }catch (Exception e){ 66 Log.d("XmlPullParser", String.valueOf(e)); 67 } 68 69 llv.postInvalidate(); 70 71 break; 72 } 73 74 }catch (Exception ex){ 75 System.out.println(ex); 76 } 77 } 78 }).start(); 79 80 ((ViewPager) collection).addView(llv,0); 81 return llv; 82 }

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

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

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

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

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

guest

回答2

0

new Thread(new Runnable(){ public void run(){ try{ ... HttpURLConnection con = (HttpURLConnection)url.openConnection(); str = InputStreamToString(con.getInputStream()); ... }catch (Exception ex){ ... } } }).start(); while(str !=null){ }

(strの初期値がnullを前提として)whileの判定までに(通信が完了せずに) str == null の場合に、何も表示しない空のPageがreturnされます。
再度同じページが指定された時には、前回の通信結果を元にパースを行って画面表示しているのではないでしょうか。
暫定対処ですが、「while(str !=null){」の前に、下記を追加したらどうなりますか。

while(str == null) { // 何もせずに待つ }

投稿2016/07/15 09:43

dsuzuki

総合スコア1682

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

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

hanhunhun

2016/07/15 09:49

ご回答ありがとうございます! ご指摘いただいた箇所ともう一点ViewPagerにaddViewしているところも怪しかったのでそこも while(llv == null) { // 何もせずに待つ } while(llv != null){ ((ViewPager) collection).addView(llv,0); } とやってみましたが駄目でした、、、
guest

0

ベストアンサー

推測通り最初の処理ではリクエストに対するレスポンスが帰ってきていないので表示されることはありません。
そのあと表示されるのはstrはフィールド変数だからです。strは一度でもレスポンスが帰ってくるとnullじゃなくなります。そうなると実際に表示されているViewは今のリクエストではなく以前のリクエストに対するレスポンスを表示するだけなので表示がずれているはずです。

改善するにはwhile文の処理もThreadの中に移動し、strをローカル変数にする必要があります。
また、breakの直前でllv.postInvalidateを呼ぶと改善する必要がありそうです。

投稿2016/07/15 09:18

yona

総合スコア18155

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

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

hanhunhun

2016/07/15 09:34

いつもご回答ありがとうございます! ご回答いただいた内容で修正すると全件表示はしたのですが1ページ目の内容が2ページ目の内容と連なって2ページ目に表示されます、、、 念のため改善後のソースを質問文に追記します、、 お手間とらせてすみません
yona

2016/07/15 09:48

それはllvもフィールド変数だからだと考えられます。 また、ここまでやるのであればLinearLayoutを継承したクラスを作った方が良さそうです。
hanhunhun

2016/07/15 10:05

llv をローカル変数で宣言することで解決できました! ありがとうございます! もしよろしければでいいのですが後者を行うメリットだったり意図だったり理解のヒントになるようなキーワード等教えてもらえませんか? ここ1カ月javaもといandroidアプリの開発を手探りながらも業務で行っているのですが一難去ってまた一難な状態で、、、基礎知識が圧倒的に足りないのを痛感しております、、、 もしよかったらここは抑えといたほうがいいよ等のことがあれば教えてくださるとうれしい限りです ご迷惑であれば申し訳ございません
yona

2016/07/15 11:18

Activity、Fragmentに全ての処理を書いていませんか? 確かに、全ての処理をこれらのクラスに書くことはできますが、クラスの行数や機能、役割等が肥大化し保守性が低下します。そこでクラスを分ける必要が出てきます。 LinearLayoutではなくListViewを使うべきかなと思います。 1:Threadで書いているクラスをAsyncTaskLoaderに書き換えて別クラスにする。 2:1のクラスはリクエストを送り、レスポンスを解析し画面に表示する為のデータのリストを作成する。 3:Activityから1のローダーを呼びして表示するデータのリストを取得する。 4:ArrayAdapterを継承したクラスを作成し、ListViewに渡す。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問