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

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

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

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

Q&A

解決済

3回答

1820閲覧

PHPが出力したXMLをもとにSpinnerの選択肢を作成したい

hanhunhun

総合スコア100

Java

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

Android

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

Android Studio

Android Studioは、 Google社によって開発された、 Androidのネイティブアプリケーション開発に特化した統合開発ツールです。

0グッド

0クリップ

投稿2016/05/26 04:40

毎度お世話になってます。

PHPが出力したXMLを解析し、そのデータをarrayListに格納しAdapterを作成してSpinnerの選択肢を作成しようと思っているのですが下記コードだと選択肢はできても選択ができず困っております。

Java

1 Handler handler = new Handler(); 2 3 public void onCreate(Bundle savedInstanceState){ 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_week); 6 7 Spinner sp = (Spinner)findViewById(R.id.spinner); 8 9 final ArrayList arrayList = new ArrayList<String>(); 10 11 new Thread(new Runnable(){ 12 @Override 13 public void run(){ 14 try{ 15 URL url = new URL("XMLをはくPHPソースのURL"); 16 HttpURLConnection con = (HttpURLConnection)url.openConnection(); 17 String str = InputStreamToString(con.getInputStream()); 18 XmlPullParser xpp = Xml.newPullParser(); 19 try{ 20 xpp.setInput(new StringReader(str)); 21 }catch (XmlPullParserException e){ 22// Log.d("XmlPullParser", "Error"); 23 } 24 25// XML解析 26 try { 27 int eventType; 28 eventType = xpp.getEventType(); 29 while (eventType != xpp.END_DOCUMENT) { 30 if((eventType == xpp.START_TAG)){ 31// 32 if("teamName".equals(xpp.getName())){ 33 34 arrayList.add(xpp.nextText()); 35 36 } 37 38 } 39 eventType = xpp.next(); 40 } 41 42 handler.post(new Runnable() { 43 @Override 44 public void run() { 45 46 } 47 }); 48// 49 50 }catch (Exception e){ 51 52 } 53 }catch (Exception ex){ 54 System.out.println(ex); 55 } 56 57 58 } 59 }).start(); 60 ArrayAdapter<String> ad = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, arrayList); 61 ad.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 62 63 sp.setAdapter(ad); 64 }

arrayList.addで任意の文字列(”テスト”)等を追加すると正常にSpinnerは動作するのですが上記コードだと選択肢が選択できない状態になります。

わかりにくい質問かもしれませんがよろしくお願いします。

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

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

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

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

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

guest

回答3

0

結局のところこの方法でうまく動作しました

java

1Handler handler = new Handler(); 2 3 public void onCreate(Bundle savedInstanceState){ 4 super.onCreate(savedInstanceState); 5 setContentView(R.layout.activity_week); 6 7 Spinner sp = (Spinner)findViewById(R.id.spinner); 8 9 final ArrayAdapter<String> ad = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item); 10 11 new Thread(new Runnable(){ 12 @Override 13 public void run(){ 14 try{ 15 URL url = new URL("XMLをはくPHPのURL"); 16 HttpURLConnection con = (HttpURLConnection)url.openConnection(); 17 String str = InputStreamToString(con.getInputStream()); 18 XmlPullParser xpp = Xml.newPullParser(); 19 try{ 20 xpp.setInput(new StringReader(str)); 21 }catch (XmlPullParserException e){ 22 Log.d("XmlPullParser", "Error"); 23 } 24 25// XML解析 26 try { 27 int eventType; 28 eventType = xpp.getEventType(); 29 while (eventType != xpp.END_DOCUMENT) { 30 if((eventType == xpp.START_TAG)){ 31 32 if("teamName".equals(xpp.getName())){ 33 34 final String txt = xpp.nextText(); 35 36 handler.post(new Runnable() { 37 @Override 38 public void run() { 39 40 ad.add(txt); 41 42 } 43 }); 44 45 46 47 } 48 49 } 50 eventType = xpp.next(); 51 } 52 53// 54 55 }catch (Exception e){ 56 Log.d("error",e.getMessage()); 57 } 58 }catch (Exception ex){ 59 System.out.println(ex); 60 } 61 62 63 } 64 }).start(); 65 66 67 ad.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 68 69 sp.setAdapter(ad); 70 71 sp.setOnItemSelectedListener(new spTeamListener()); 72 }

変更点は一度ArrayListに格納したデータをAdapterにセットしていたところを直でAdapterに格納するようにしたところうまく動作しました。

ご回答いただきありがとうございました

投稿2016/05/27 01:15

編集2016/05/27 02:00
hanhunhun

総合スコア100

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

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

0

ベストアンサー

XMLをパースした後に下記の処理移動させるといいと思いますよ。

Java

1runOnUiThread(new Runnable() { 2 @Override 3 public void run() { 4 ArrayAdapter<String> ad = new ArrayAdapter<String>(this,android.R.layout.simple_spinner_item, arrayList); 5 ad.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); 6 sp.setAdapter(ad); 7 } 8});

投稿2016/05/26 13:58

yona

総合スコア18155

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

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

hanhunhun

2016/05/27 00:42

ご返答ありがとうございます! このコードだとArrayAdapterのところでコンストラクタが解決できてない旨のエラーがでてしまうんですよね、、、自分はjava触り始めてまだ間もなくてAndroidStudioのエラーの見かた等々まだわからずパッとしない返答ですみません
yona

2016/05/27 01:14

そうですね。 thisはインスタンス自身なのでこの場所では[Activity名].thisにする必要があります。
hanhunhun

2016/05/27 02:56

すみません、、、ものすごく初歩的なことをわかってなかったみたいです、、、お恥ずかしい 問題が解決しました! ちなみに差し支えなければ自己解決で提示しているコードは問題ないでしょうか? 後学の参考にしたいです!
yona

2016/05/27 03:25

コードは問題無いと思います。 今回の原因はAdapterが保持するArrayListに対してAdapterを経由せずにArrayListに直接要素を追加したため、Adapterは要素が増えたことに気づけませんでした。 対策としては2つあります。 ・自己解決の通りAdapterに要素を追加すること。 ・dekaakiさんの回答の通りArrayListに要素を追加し、Adapter#notifyDataSetChangedを呼ぶことでAdapterに要素の変更を通知すること。 私はスピナーは通信が正常に終わらない限り使い物にならないと思っていたので、通信が終わった後にAdapterを作りセットする方法を提案しました。
hanhunhun

2016/05/28 00:16

なるほど、、 ということはマルチスレッドはUIスレッドの処理の途中に処理を差し込むのではなく同時進行で処理を行う、だからマルチスレッドの処理が中途半端なままUIスレッドでAdapterを作って中途半端なArrayListをセットしていたからSpinnerが正常に動かなかったんですね、、 大変参考になりました!ありがとうございます!
guest

0

確かadapterの元となったコレクションを直接操作した場合は
notifyDataSetChangedを呼び出してあげないと変更した内容が正しく伝わらないと記憶してます。

参考プログラムを動かすと確かにリストは作成されて、画面上も表示はされるがタップして選択すると選択状態は解除されてました。

そこでリストの設定が終了した時点でnotifyDataSetChangedを呼び出してあげると正しく動作するようになりました。
また、Activityで非同期処理を行い、UIスレッドに戻って何かしたい場合はHandlerを使うのもいいですがUIスレッドで実行してもらうためのrunOnUiThreadメソッドがActivityにはありますのでそれを使用するようにしてみました。
こんな感じでどうでしょう?

java

1 new Thread(new Runnable() { 2 @Override 3 public void run() { 4 5 try { 6 Thread.sleep(5000); 7 } catch (InterruptedException e) { 8 } 9 10 arrayList.add("test1"); 11 arrayList.add("test2"); 12 arrayList.add("test3"); 13 arrayList.add("test4"); 14 arrayList.add("test5"); 15 16 runOnUiThread(new Runnable() { 17 @Override 18 public void run() { 19 Spinner sp = (Spinner) findViewById(R.id.spinner); 20 ((ArrayAdapter<String>)sp.getAdapter()).notifyDataSetChanged(); 21 } 22 }); 23 24 } 25 }).start();

投稿2016/05/26 13:39

dekaaki

総合スコア292

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

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

hanhunhun

2016/05/27 01:11

回答ありがとうございます! このコードを試してみたんですがspinnerに値がセットできませんでした、、、 handlerとrunOnUiThreadの違いについても掘り下げて学習します!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問