###前提・実現したいこと
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
よろしくお願いします。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。