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

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

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

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

Android

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

Q&A

解決済

1回答

3655閲覧

コールバックでViewに値渡しができません。

s.k

総合スコア423

Java

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

Android

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

0グッド

0クリップ

投稿2017/06/03 02:06

編集2017/06/03 03:06

###前提・実現したいこと
HTTP通信で取得したJSON配列データをフラグメントで表示したいです。
Retrofit2を使っていて、別スレッドで通信が行われるので、値をフラグメントに表示(渡す)するには、
コールバック関数が必要であるとわかりました。

コールバック関数を実装したのですが、
フラグメントにコールバック関数で値を渡す方法がわかりません。

流れだけでも構いませんので、
値を渡す方法を教えてください。

※当初の投稿より変更しました。コールバック関数に引数を追加しました。

###発生している問題・エラーメッセージ

ログを載せます。

java

106-03 12:01:27.429 32110-32110/station.around.aroundsatation I/System.out:206-03 12:01:27.429 32110-32110/station.around.aroundsatation I/System.out: [] 306-03 12:01:27.429 32110-32110/station.around.aroundsatation I/System.out:406-03 12:01:27.430 32110-32110/station.around.aroundsatation I/System.out: あああ 506-03 12:01:27.430 32110-32110/station.around.aroundsatation I/System.out: [] 606-03 12:01:27.430 32110-32110/station.around.aroundsatation I/System.out: いいい 706-03 12:01:27.603 32110-32110/station.around.aroundsatation I/System.out: [station.around.aroundsatation.model.ListImage@f36cbfa, station.around.aroundsatation.model.ListImage@9d735ab, station.around.aroundsatation.model.ListImage@3e2408, station.around.aroundsatation.model.ListImage@f9ff7a1, station.around.aroundsatation.model.ListImage@c15adc6] 806-03 12:01:27.603 32110-32110/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@f36cbfa 906-03 12:01:27.603 32110-32110/station.around.aroundsatation I/System.out: http://i.imgur.com/9h81ns6.jpg 1006-03 12:01:27.603 32110-32110/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@9d735ab 1106-03 12:01:27.603 32110-32110/station.around.aroundsatation I/System.out: kamkack;m 1206-03 12:01:27.603 32110-32110/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@3e2408 1306-03 12:01:27.603 32110-32110/station.around.aroundsatation I/System.out: lmascml;cal; 1406-03 12:01:27.603 32110-32110/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@f9ff7a1 1506-03 12:01:27.603 32110-32110/station.around.aroundsatation I/System.out: lm;ac;mdc;lm 1606-03 12:01:27.603 32110-32110/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@c15adc6 1706-03 12:01:27.604 32110-32110/station.around.aroundsatation I/System.out: l;dcmk;dck; 1806-03 12:01:27.604 32110-32110/station.around.aroundsatation I/System.out: コールバック成功! 1906-03 12:01:27.604 32110-32110/station.around.aroundsatation I/System.out: [http://i.imgur.com/9h81ns6.jpg, kamkack;m, lmascml;cal;, lm;ac;mdc;lm, l;dcmk;dck;] 2006-03 12:01:27.652 32110-32130/station.around.aroundsatation D/OpenGLRenderer: endAllActiveAnimators on 0x9b336e00 (RippleDrawable) with handle 0x9b330390

###該当のソースコード

HttpConnect.java

passListメソッドがHTTP通信でJSON配列データを取得します。
passList内のonResponseメソッド内にコールバック関数を仕込みました。

Java

1 2import java.util.List; 3 4public class HttpConnect { 5 6 7 public List<String> lists = new ArrayList<String>(); 8 private CallHttp.CallHttpCallbacks callback = null; 9 10 public HttpConnect(CallHttp.CallHttpCallbacks callback) { ★コンストラクタ★ 11 this.callback = callback; 12 } 13 14 public Call<List<ListImage>> passList(){ 15 Retrofit retrofit = new Retrofit.Builder() 16 .baseUrl("http://candii.tk/") 17 .addConverterFactory(GsonConverterFactory.create()) 18 .build(); 19 ImageClient service = retrofit.create(ImageClient.class); 20 21 22 Call<List<ListImage>> call2 = service.listImages(); 23 System.out.println(service.listImages()); 24 25 call2.enqueue(new Callback<List<ListImage>>() { 26 @Override 27 public void onResponse(Call<List<ListImage>> call, Response<List<ListImage>> response) { 28 List<ListImage> listImage = response.body(); 29 System.out.println(response.body()); 30 int s = listImage.size(); 31 32 33 for(int i = 0; i < s; i++){ 34 Log.d("debug3", listImage.get(i).toString()); 35 System.out.println(listImage.get(i).getEn_title()); 36 lists.add(listImage.get(i).getEn_title()); 37 } 38 callback.callbackMethod(lists); ①コールバック関数 39 40 } 41 42 @Override 43 public void onFailure(Call<List<ListImage>> call, Throwable t) { 44 Log.d("debug4", t.getMessage()); 45 } 46 }); 47 System.out.println("あ"); 48 System.out.println(lists); 49 System.out.println("い"); 50 return call2; 51 } 52 53 54 55 56}

Present.java

setListAdapterメソッドの第三引数内に配列データが入ります。
コールバック関数で第三引数に取得した配列データをセットしたいです。
callbackMethodがコールバック関数です。

Java

1 2public class Present extends Activity { 3 4 5 @Override 6 protected void onCreate(Bundle savedInstanceState) { 7 super.onCreate(savedInstanceState); 8 setContentView(R.layout.present); 9 } 10 11 //リストフラグメントの生成(2) 12 public static class TitlesFragment extends ListFragment implements CallHttp.CallHttpCallbacks { 13 private int pos = -1; 14 public HttpConnect hc = new HttpConnect(this); 15 public List<String> lists = new ArrayList<String>(); 16 17 //アクティビティ生成完了時に呼ばれる(3) 18 @Override 19 public void onActivityCreated(Bundle bundle) { 20 super.onActivityCreated(bundle); 21 22 hc.passList(); ★HTTP通信&JSONデータ取得メソッド★ 23 System.out.println("あああ"); 24 System.out.println(lists); 25 System.out.println("いいい"); 26 setListAdapter(new ArrayAdapter<String>(getActivity(), 27 android.R.layout.simple_list_item_activated_1, 28 lists)); ②JSONデータが入る予定の配列 29 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 30 getListView().setBackgroundColor(Color.LTGRAY); 31 if (isTablet(getActivity())) showDetails(0); 32 } 33 34 //リスト要素クリック時に呼ばれる 35 @Override 36 public void onListItemClick(ListView l, View v, int pos, long id) { 37 showDetails(pos); 38 } 39 40 //詳細の表示 41 private void showDetails(int index) { 42 Context context = getActivity().getApplication(); 43 44 //フラグメントの切り換え(4) 45 if (isTablet(context)) { 46 getListView().setItemChecked(index, true); 47 if (pos == index) return; 48 DetailActivity.DetailsFragment fragment = 49 DetailActivity.DetailsFragment.newInstance(index); 50 FragmentTransaction ft = getFragmentManager().beginTransaction(); 51 ft.replace(R.id.details, fragment); 52 ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE); 53 ft.commit(); 54 pos = index; 55 } 56 //アクティビティの起動 57 else { 58 getListView().setItemChecked(index, false); 59 Intent intent = new Intent(context, DetailActivity.class); 60 intent.putExtra("index", index); 61 getActivity().startActivity(intent); 62 } 63 } 64 65 @Override ★引数設置★ 66 public void callbackMethod(List<String> lists){ ③コールバック関数★Viewに配列(lists)を渡す処理を書きたいです★ 67 System.out.println( "コールバック成功!"); 68 System.out.println(lists); 69 } 70 71 } 72 73 //タブレットかどうかの取得(5) 74 public static boolean isTablet(Context context) { 75 return (context.getResources().getConfiguration().screenLayout& 76 Configuration.SCREENLAYOUT_SIZE_MASK) == 77 Configuration.SCREENLAYOUT_SIZE_XLARGE; 78 } 79 80} 81

一応、載せておきます。
CallHttp.java

Java

1public class CallHttp { 2 3 //コールバックインターフェース作成 4 public interface CallHttpCallbacks { 5 public void callbackMethod(List<String> lists); ★変更(引数設置)★ 6 } 7 8 //コールバック対象クラス指定用インスタンス生成 9 private CallHttpCallbacks _callHttpCallbacks; 10 11 //コールバック対象クラス指定メソッド 12 public void setCallbacks(CallHttpCallbacks callHttpCallbacks) { 13 _callHttpCallbacks = callHttpCallbacks; 14 } 15 16} 17

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

自己解決

自己解決しました。
しかし、この方法で本当にいいのか疑問です。
かなり強引に行きました。

解決してはいますが、ご意見頂けますと嬉しいです。

Present.javaのフラグメントのリストを表示する処理をメソッド化し、
そのメソッドをコールバック関数内に仕込みました。

実現した流れは以下です。

①JSON配列データリスト表示メソッド起動(Present.java#setListAdapterMethod)
②HTTP通信&JSONデータ取得(HttpConnect.java#passList)
③JSONデータ取得後にコールバック関数の起動(Present.java#callbackMethod)
④コールバック関数内でもう一度配列データリスト表示メソッド起動(Present.java#callbackMethod#setListAdapterMethod)

setListAdapterMethodを新しく作り解決できました。

Before

Java

1 setListAdapter(new ArrayAdapter<String>(getActivity(), 2 android.R.layout.simple_list_item_activated_1, 3 lists)); 4 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 5 getListView().setBackgroundColor(Color.LTGRAY); 6 if (isTablet(getActivity())) showDetails(0);

After

Java

1 2 public void setListAdapterMethod(List<String> lists){ 3 System.out.println(lists); 4 setListAdapter(new ArrayAdapter<String>(getActivity(), 5 android.R.layout.simple_list_item_activated_1, 6 lists)); 7 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 8 getListView().setBackgroundColor(Color.LTGRAY); 9 if (isTablet(getActivity())) showDetails(0); 10 }

★以下全コード★

Present.java

Java

1public class Present extends Activity { 2 3 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 4 5 //リストフラグメントの生成(2) 6 public static class TitlesFragment extends ListFragment implements CallHttp.CallHttpCallbacks { 7 8 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 9 10 //アクティビティ生成完了時に呼ばれる(3) 11 @Override 12 public void onActivityCreated(Bundle bundle) { 13 super.onActivityCreated(bundle); 14 15 hc.passList(); 16 System.out.println("あああ"); 17 System.out.println(lists); 18 System.out.println("いいい"); 19 setListAdapterMethod(lists); ★メソッド化★ 20 } 21 22 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜 23 24 25 public void callbackMethod(List<String> lists){ 26 System.out.println( "コールバック成功!"); 27 System.out.println(lists); 28 setListAdapterMethod(lists); ★メソッド追加★ 29 } 30 31 32 public void setListAdapterMethod(List<String> lists){ ★メソッド化★ 33 System.out.println(lists); 34 setListAdapter(new ArrayAdapter<String>(getActivity(), 35 android.R.layout.simple_list_item_activated_1, 36 lists)); 37 getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE); 38 getListView().setBackgroundColor(Color.LTGRAY); 39 if (isTablet(getActivity())) showDetails(0); 40 } 41 } 42 43 44}

投稿2017/06/03 03:34

編集2017/06/03 03:36
s.k

総合スコア423

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問