質問編集履歴

4 情報修正

s.k

s.k score 409

2017/06/03 12:06  投稿

コールバックでViewに値渡しができません。
###前提・実現したいこと
HTTP通信で取得したJSON配列データをフラグメントで表示したいです。
Retrofit2を使っていて、別スレッドで通信が行われるので、値をフラグメントに表示(渡す)するには、
コールバック関数が必要であるとわかりました。
コールバック関数を実装したのですが、
フラグメントにコールバック関数で値を渡す方法がわかりません。
流れだけでも構いませんので、
値を渡す方法を教えてください。
 
 
※当初の投稿より変更しました。コールバック関数に引数を追加しました。  
 
###発生している問題・エラーメッセージ
ログを載せます。
```java
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: あ
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: []
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: い
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: あああ
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: []
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: いいい
06-03 10:50:37.204 10896-10924/station.around.aroundsatation D/OpenGLRenderer: endAllActiveAnimators on 0x9b340e00 (RippleDrawable) with handle 0xac2ec260
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: [station.around.aroundsatation.model.ListImage@f9ff7a1, station.around.aroundsatation.model.ListImage@c15adc6, station.around.aroundsatation.model.ListImage@d518187, station.around.aroundsatation.model.ListImage@69578b4, station.around.aroundsatation.model.ListImage@7a36cdd]
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@f9ff7a1
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: http://i.imgur.com/9h81ns6.jpg----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@c15adc6
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: kamkack;m----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@d518187
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: lmascml;cal;----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@69578b4
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: lm;ac;mdc;lm----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@7a36cdd
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: l;dcmk;dck;----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: コールバック成功!---------①コールバック関数
06-03 12:01:27.429 32110-32110/station.around.aroundsatation I/System.out: あ
06-03 12:01:27.429 32110-32110/station.around.aroundsatation I/System.out: []
06-03 12:01:27.429 32110-32110/station.around.aroundsatation I/System.out: い
06-03 12:01:27.430 32110-32110/station.around.aroundsatation I/System.out: あああ
06-03 12:01:27.430 32110-32110/station.around.aroundsatation I/System.out: []
06-03 12:01:27.430 32110-32110/station.around.aroundsatation I/System.out: いいい
06-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]
06-03 12:01:27.603 32110-32110/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@f36cbfa
06-03 12:01:27.603 32110-32110/station.around.aroundsatation I/System.out: http://i.imgur.com/9h81ns6.jpg
06-03 12:01:27.603 32110-32110/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@9d735ab
06-03 12:01:27.603 32110-32110/station.around.aroundsatation I/System.out: kamkack;m
06-03 12:01:27.603 32110-32110/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@3e2408
06-03 12:01:27.603 32110-32110/station.around.aroundsatation I/System.out: lmascml;cal;
06-03 12:01:27.603 32110-32110/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@f9ff7a1
06-03 12:01:27.603 32110-32110/station.around.aroundsatation I/System.out: lm;ac;mdc;lm
06-03 12:01:27.603 32110-32110/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@c15adc6
06-03 12:01:27.604 32110-32110/station.around.aroundsatation I/System.out: l;dcmk;dck;
06-03 12:01:27.604 32110-32110/station.around.aroundsatation I/System.out: コールバック成功!
06-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;]
06-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
import java.util.List;
public class HttpConnect {
   public List<String> lists = new ArrayList<String>();
   private CallHttp.CallHttpCallbacks callback = null;
   public HttpConnect(CallHttp.CallHttpCallbacks callback) { ★コンストラクタ★
    this.callback = callback;
   }
   public Call<List<ListImage>> passList(){
       Retrofit retrofit = new Retrofit.Builder()
               .baseUrl("http://candii.tk/")
               .addConverterFactory(GsonConverterFactory.create())
               .build();
       ImageClient service = retrofit.create(ImageClient.class);
       Call<List<ListImage>> call2 = service.listImages();
       System.out.println(service.listImages());
       call2.enqueue(new Callback<List<ListImage>>() {
           @Override
           public void onResponse(Call<List<ListImage>> call, Response<List<ListImage>> response) {
               List<ListImage> listImage = response.body();
               System.out.println(response.body());
               int s = listImage.size();
               for(int i = 0; i < s; i++){
                   Log.d("debug3", listImage.get(i).toString());
                   System.out.println(listImage.get(i).getEn_title());
                   lists.add(listImage.get(i).getEn_title());
               }
               callback.callbackMethod(); ①コールバック関数
               callback.callbackMethod(lists); ①コールバック関数
           }
           @Override
           public void onFailure(Call<List<ListImage>> call, Throwable t) {
               Log.d("debug4", t.getMessage());
           }
       });
       System.out.println("あ");
       System.out.println(lists);
       System.out.println("い");
       return call2;
   }
}
```
Present.java
setListAdapterメソッドの第三引数内に配列データが入ります。
コールバック関数で第三引数に取得した配列データをセットしたいです。
callbackMethodがコールバック関数です。
```Java
public class Present extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.present);
   }
   //リストフラグメントの生成(2)
   public static class TitlesFragment extends ListFragment implements CallHttp.CallHttpCallbacks {
       private int pos = -1;
       public HttpConnect hc = new HttpConnect(this);
       public List<String> lists = new ArrayList<String>();
       //アクティビティ生成完了時に呼ばれる(3)
       @Override
       public void onActivityCreated(Bundle bundle) {
           super.onActivityCreated(bundle);
           hc.passList(); ★HTTP通信&JSONデータ取得メソッド★
           System.out.println("あああ");
           System.out.println(lists);
           System.out.println("いいい");
           setListAdapter(new ArrayAdapter<String>(getActivity(),
                   android.R.layout.simple_list_item_activated_1,
                   lists)); ②JSONデータが入る予定の配列
           getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
           getListView().setBackgroundColor(Color.LTGRAY);
           if (isTablet(getActivity())) showDetails(0);
       }
       //リスト要素クリック時に呼ばれる
       @Override
       public void onListItemClick(ListView l, View v, int pos, long id) {
           showDetails(pos);
       }
       //詳細の表示
       private void showDetails(int index) {
           Context context = getActivity().getApplication();
           //フラグメントの切り換え(4)
           if (isTablet(context)) {
               getListView().setItemChecked(index, true);
               if (pos == index) return;
               DetailActivity.DetailsFragment fragment =
                       DetailActivity.DetailsFragment.newInstance(index);
               FragmentTransaction ft = getFragmentManager().beginTransaction();
               ft.replace(R.id.details, fragment);
               ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
               ft.commit();
               pos = index;
           }
           //アクティビティの起動
           else {
               getListView().setItemChecked(index, false);
               Intent intent = new Intent(context, DetailActivity.class);
               intent.putExtra("index", index);
               getActivity().startActivity(intent);
           }
       }
    @Override
       public void callbackMethod(){ ③コールバック関数★Viewに配列(lists)を渡す処理を書きたいです★
    @Override ★引数設置★
       public void callbackMethod(List<String> lists){ ③コールバック関数★Viewに配列(lists)を渡す処理を書きたいです★
           System.out.println( "コールバック成功!");
           System.out.println(lists);  
       }
   }
   //タブレットかどうかの取得(5)
   public static boolean isTablet(Context context) {
       return (context.getResources().getConfiguration().screenLayout&
               Configuration.SCREENLAYOUT_SIZE_MASK) ==
               Configuration.SCREENLAYOUT_SIZE_XLARGE;
   }
}
```
一応、載せておきます。
CallHttp.java
```Java
public class CallHttp {
   //コールバックインターフェース作成
   public interface CallHttpCallbacks {
       public void callbackMethod();
       public void callbackMethod(List<String> lists); ★変更(引数設置)★
   }
   //コールバック対象クラス指定用インスタンス生成
   private CallHttpCallbacks _callHttpCallbacks;
   //コールバック対象クラス指定メソッド
   public void setCallbacks(CallHttpCallbacks callHttpCallbacks) {
       _callHttpCallbacks = callHttpCallbacks;
   }
   public void method() {  
       _callHttpCallbacks.callbackMethod();  
   }  
}
```
よろしくお願いします。
  • Java

    23437 questions

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

  • Android

    9983 questions

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

3 情報追加

s.k

s.k score 409

2017/06/03 11:21  投稿

コールバックでViewに値渡しができません。
###前提・実現したいこと
HTTP通信で取得したJSON配列データをフラグメントで表示したいです。
Retrofit2を使っていて、別スレッドで通信が行われるので、値をフラグメントに表示(渡す)するには、
コールバック関数が必要であるとわかりました。
コールバック関数を実装したのですが、
フラグメントにコールバック関数で値を渡す方法がわかりません。
流れだけでも構いませんので、
値を渡す方法を教えてください。
###発生している問題・エラーメッセージ
ログを載せます。
```java
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: あ
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: []
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: い
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: あああ
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: []
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: いいい
06-03 10:50:37.204 10896-10924/station.around.aroundsatation D/OpenGLRenderer: endAllActiveAnimators on 0x9b340e00 (RippleDrawable) with handle 0xac2ec260
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: [station.around.aroundsatation.model.ListImage@f9ff7a1, station.around.aroundsatation.model.ListImage@c15adc6, station.around.aroundsatation.model.ListImage@d518187, station.around.aroundsatation.model.ListImage@69578b4, station.around.aroundsatation.model.ListImage@7a36cdd]
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@f9ff7a1
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: http://i.imgur.com/9h81ns6.jpg----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@c15adc6
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: kamkack;m----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@d518187
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: lmascml;cal;----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@69578b4
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: lm;ac;mdc;lm----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@7a36cdd
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: l;dcmk;dck;----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: コールバック成功!---------①コールバック関数
```
###該当のソースコード
HttpConnect.java
 
passListメソッドがHTTP通信でJSON配列データを取得します。  
passList内のonResponseメソッド内にコールバック関数を仕込みました。  
 
```Java
import java.util.List;
public class HttpConnect {
   public List<String> lists = new ArrayList<String>();
   private CallHttp.CallHttpCallbacks callback = null;
   public HttpConnect(CallHttp.CallHttpCallbacks callback) { ★コンストラクタ★
    this.callback = callback;
   }
   public Call<List<ListImage>> passList(){
       Retrofit retrofit = new Retrofit.Builder()
               .baseUrl("http://candii.tk/")
               .addConverterFactory(GsonConverterFactory.create())
               .build();
       ImageClient service = retrofit.create(ImageClient.class);
       Call<List<ListImage>> call2 = service.listImages();
       System.out.println(service.listImages());
       call2.enqueue(new Callback<List<ListImage>>() {
           @Override
           public void onResponse(Call<List<ListImage>> call, Response<List<ListImage>> response) {
               List<ListImage> listImage = response.body();
               System.out.println(response.body());
               int s = listImage.size();
               for(int i = 0; i < s; i++){
                   Log.d("debug3", listImage.get(i).toString());
                   System.out.println(listImage.get(i).getEn_title());
                   lists.add(listImage.get(i).getEn_title());
               }
               callback.callbackMethod(); ①コールバック関数
           }
           @Override
           public void onFailure(Call<List<ListImage>> call, Throwable t) {
               Log.d("debug4", t.getMessage());
           }
       });
       System.out.println("あ");
       System.out.println(lists);
       System.out.println("い");
       return call2;
   }
}
```
Present.java
 
setListAdapterメソッドの第三引数内に配列データが入ります。  
コールバック関数で第三引数に取得した配列データをセットしたいです。  
callbackMethodがコールバック関数です。  
 
```Java
public class Present extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.present);
   }
   //リストフラグメントの生成(2)
   public static class TitlesFragment extends ListFragment implements CallHttp.CallHttpCallbacks {
       private int pos = -1;
       public HttpConnect hc = new HttpConnect(this);
       public List<String> lists = new ArrayList<String>();
       //アクティビティ生成完了時に呼ばれる(3)
       @Override
       public void onActivityCreated(Bundle bundle) {
           super.onActivityCreated(bundle);
           hc.passList(); ★HTTP通信&JSONデータ取得メソッド★
           System.out.println("あああ");
           System.out.println(lists);
           System.out.println("いいい");
           setListAdapter(new ArrayAdapter<String>(getActivity(),
                   android.R.layout.simple_list_item_activated_1,
                   lists)); ②JSONデータが入る予定の配列
           getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
           getListView().setBackgroundColor(Color.LTGRAY);
           if (isTablet(getActivity())) showDetails(0);
       }
       //リスト要素クリック時に呼ばれる
       @Override
       public void onListItemClick(ListView l, View v, int pos, long id) {
           showDetails(pos);
       }
       //詳細の表示
       private void showDetails(int index) {
           Context context = getActivity().getApplication();
           //フラグメントの切り換え(4)
           if (isTablet(context)) {
               getListView().setItemChecked(index, true);
               if (pos == index) return;
               DetailActivity.DetailsFragment fragment =
                       DetailActivity.DetailsFragment.newInstance(index);
               FragmentTransaction ft = getFragmentManager().beginTransaction();
               ft.replace(R.id.details, fragment);
               ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
               ft.commit();
               pos = index;
           }
           //アクティビティの起動
           else {
               getListView().setItemChecked(index, false);
               Intent intent = new Intent(context, DetailActivity.class);
               intent.putExtra("index", index);
               getActivity().startActivity(intent);
           }
       }
    @Override
       public void callbackMethod(){ ③コールバック関数★Viewに配列(lists)を渡す処理を書きたいです★
           System.out.println( "コールバック成功!");
       }
   }
   //タブレットかどうかの取得(5)
   public static boolean isTablet(Context context) {
       return (context.getResources().getConfiguration().screenLayout&
               Configuration.SCREENLAYOUT_SIZE_MASK) ==
               Configuration.SCREENLAYOUT_SIZE_XLARGE;
   }
}
```
一応、載せておきます。
CallHttp.java
```Java
public class CallHttp {
   //コールバックインターフェース作成
   public interface CallHttpCallbacks {
       public void callbackMethod();
   }
   //コールバック対象クラス指定用インスタンス生成
   private CallHttpCallbacks _callHttpCallbacks;
   //コールバック対象クラス指定メソッド
   public void setCallbacks(CallHttpCallbacks callHttpCallbacks) {
       _callHttpCallbacks = callHttpCallbacks;
   }
   public void method() {
       _callHttpCallbacks.callbackMethod();
   }
}
```
よろしくお願いします。
  • Java

    23437 questions

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

  • Android

    9983 questions

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

2 タグ削除

s.k

s.k score 409

2017/06/03 11:08  投稿

コールバックでViewに値渡しができません。
###前提・実現したいこと
HTTP通信で取得したJSON配列データをフラグメントで表示したいです。
Retrofit2を使っていて、別スレッドで通信が行われるので、値をフラグメントに表示(渡す)するには、
コールバック関数が必要であるとわかりました。
コールバック関数を実装したのですが、
フラグメントにコールバック関数で値を渡す方法がわかりません。
流れだけでも構いませんので、
値を渡す方法を教えてください。
###発生している問題・エラーメッセージ
ログを載せます。
```java
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: あ
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: []
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: い
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: あああ
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: []
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: いいい
06-03 10:50:37.204 10896-10924/station.around.aroundsatation D/OpenGLRenderer: endAllActiveAnimators on 0x9b340e00 (RippleDrawable) with handle 0xac2ec260
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: [station.around.aroundsatation.model.ListImage@f9ff7a1, station.around.aroundsatation.model.ListImage@c15adc6, station.around.aroundsatation.model.ListImage@d518187, station.around.aroundsatation.model.ListImage@69578b4, station.around.aroundsatation.model.ListImage@7a36cdd]
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@f9ff7a1
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: http://i.imgur.com/9h81ns6.jpg----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@c15adc6
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: kamkack;m----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@d518187
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: lmascml;cal;----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@69578b4
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: lm;ac;mdc;lm----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@7a36cdd
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: l;dcmk;dck;----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: コールバック成功!---------①コールバック関数
```
###該当のソースコード
HttpConnect.java
```Java
import java.util.List;
public class HttpConnect {
public List<String> lists = new ArrayList<String>();
private CallHttp.CallHttpCallbacks callback = null;
public HttpConnect(CallHttp.CallHttpCallbacks callback) { ★コンストラクタ★
this.callback = callback;
}
public Call<List<ListImage>> passList(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl("http://candii.tk/")
.addConverterFactory(GsonConverterFactory.create())
.build();
ImageClient service = retrofit.create(ImageClient.class);
Call<List<ListImage>> call2 = service.listImages();
System.out.println(service.listImages());
call2.enqueue(new Callback<List<ListImage>>() {
@Override
public void onResponse(Call<List<ListImage>> call, Response<List<ListImage>> response) {
List<ListImage> listImage = response.body();
System.out.println(response.body());
int s = listImage.size();
for(int i = 0; i < s; i++){
Log.d("debug3", listImage.get(i).toString());
System.out.println(listImage.get(i).getEn_title());
lists.add(listImage.get(i).getEn_title());
}
callback.callbackMethod(); ①コールバック関数
}
@Override
public void onFailure(Call<List<ListImage>> call, Throwable t) {
Log.d("debug4", t.getMessage());
}
});
System.out.println("あ");
System.out.println(lists);
System.out.println("い");
return call2;
}
}
```
Present.java
```Java
public class Present extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.present);
}
//リストフラグメントの生成(2)
public static class TitlesFragment extends ListFragment implements CallHttp.CallHttpCallbacks {
private int pos = -1;
public HttpConnect hc = new HttpConnect(this);
public List<String> lists = new ArrayList<String>();
//アクティビティ生成完了時に呼ばれる(3)
@Override
public void onActivityCreated(Bundle bundle) {
super.onActivityCreated(bundle);
hc.passList(); ★HTTP通信&JSONデータ取得メソッド★
System.out.println("あああ");
System.out.println(lists);
System.out.println("いいい");
setListAdapter(new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_activated_1,
lists)); ②JSONデータが入る予定の配列
getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
getListView().setBackgroundColor(Color.LTGRAY);
if (isTablet(getActivity())) showDetails(0);
}
//リスト要素クリック時に呼ばれる
@Override
public void onListItemClick(ListView l, View v, int pos, long id) {
showDetails(pos);
}
//詳細の表示
private void showDetails(int index) {
Context context = getActivity().getApplication();
//フラグメントの切り換え(4)
if (isTablet(context)) {
getListView().setItemChecked(index, true);
if (pos == index) return;
DetailActivity.DetailsFragment fragment =
DetailActivity.DetailsFragment.newInstance(index);
FragmentTransaction ft = getFragmentManager().beginTransaction();
ft.replace(R.id.details, fragment);
ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
ft.commit();
pos = index;
}
//アクティビティの起動
else {
getListView().setItemChecked(index, false);
Intent intent = new Intent(context, DetailActivity.class);
intent.putExtra("index", index);
getActivity().startActivity(intent);
}
}
@Override
public void callbackMethod(){ ③コールバック関数★Viewに配列(lists)を渡す処理を書きたいです★
System.out.println( "コールバック成功!");
}
}
//タブレットかどうかの取得(5)
public static boolean isTablet(Context context) {
return (context.getResources().getConfiguration().screenLayout&
Configuration.SCREENLAYOUT_SIZE_MASK) ==
Configuration.SCREENLAYOUT_SIZE_XLARGE;
}
}
```
一応、載せておきます。
CallHttp.java
```Java
public class CallHttp {
//コールバックインターフェース作成
public interface CallHttpCallbacks {
public void callbackMethod();
}
//コールバック対象クラス指定用インスタンス生成
private CallHttpCallbacks _callHttpCallbacks;
//コールバック対象クラス指定メソッド
public void setCallbacks(CallHttpCallbacks callHttpCallbacks) {
_callHttpCallbacks = callHttpCallbacks;
}
public void method() {
_callHttpCallbacks.callbackMethod();
}
}
```
よろしくお願いします。
  • Java

    23437 questions

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

  • Android

    9983 questions

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

  • コールバック

    49 questions

    コールバックは他のコードに引数として渡されるコードのことを指します。

1 情報追加

s.k

s.k score 409

2017/06/03 11:07  投稿

コールバックでViewに値渡しができません。
###前提・実現したいこと
HTTP通信で取得したJSON配列データをフラグメントで表示したいです。
Retrofit2を使っていて、別スレッドで通信が行われるので、値をフラグメントに表示(渡す)するには、
コールバック関数が必要であるとわかりました。
コールバック関数を実装したのですが、
フラグメントにコールバック関数で値を渡す方法がわかりません。
流れだけでも構いませんので、
値を渡す方法を教えてください。
###発生している問題・エラーメッセージ
ログを載せます。
```java
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: あ
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: []
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: い
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: あああ
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: []
06-03 10:50:37.061 10896-10896/station.around.aroundsatation I/System.out: いいい
06-03 10:50:37.204 10896-10924/station.around.aroundsatation D/OpenGLRenderer: endAllActiveAnimators on 0x9b340e00 (RippleDrawable) with handle 0xac2ec260
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: [station.around.aroundsatation.model.ListImage@f9ff7a1, station.around.aroundsatation.model.ListImage@c15adc6, station.around.aroundsatation.model.ListImage@d518187, station.around.aroundsatation.model.ListImage@69578b4, station.around.aroundsatation.model.ListImage@7a36cdd]
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@f9ff7a1
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: http://i.imgur.com/9h81ns6.jpg----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@c15adc6
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: kamkack;m----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@d518187
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: lmascml;cal;----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@69578b4
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: lm;ac;mdc;lm----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation D/debug3: station.around.aroundsatation.model.ListImage@7a36cdd
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: l;dcmk;dck;----------HTTP通信で取得したJSONデータ
06-03 10:50:37.207 10896-10896/station.around.aroundsatation I/System.out: コールバック成功!---------①コールバック関数
```
###該当のソースコード
HttpConnect.java
```Java
import java.util.List;
public class HttpConnect {
   public List<String> lists = new ArrayList<String>();
   private CallHttp.CallHttpCallbacks callback = null;
   public HttpConnect(CallHttp.CallHttpCallbacks callback) { ★コンストラクタ★
    this.callback = callback;
   }
   public Call<List<ListImage>> passList(){
       Retrofit retrofit = new Retrofit.Builder()
               .baseUrl("http://candii.tk/")
               .addConverterFactory(GsonConverterFactory.create())
               .build();
       ImageClient service = retrofit.create(ImageClient.class);
       Call<List<ListImage>> call2 = service.listImages();
       System.out.println(service.listImages());
       call2.enqueue(new Callback<List<ListImage>>() {
           @Override
           public void onResponse(Call<List<ListImage>> call, Response<List<ListImage>> response) {
               List<ListImage> listImage = response.body();
               System.out.println(response.body());
               int s = listImage.size();
               for(int i = 0; i < s; i++){
                   Log.d("debug3", listImage.get(i).toString());
                   System.out.println(listImage.get(i).getEn_title());
                   lists.add(listImage.get(i).getEn_title());
               }
               callback.callbackMethod(); ①コールバック関数
           }
           @Override
           public void onFailure(Call<List<ListImage>> call, Throwable t) {
               Log.d("debug4", t.getMessage());
           }
       });
       System.out.println("あ");
       System.out.println(lists);
       System.out.println("い");
       return call2;
   }
}
```
Present.java
```Java
public class Present extends Activity {
   @Override
   protected void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.present);
   }
   //リストフラグメントの生成(2)
   public static class TitlesFragment extends ListFragment implements CallHttp.CallHttpCallbacks {
       private int pos = -1;
       public HttpConnect hc = new HttpConnect(this);
       public List<String> lists = new ArrayList<String>();
       //アクティビティ生成完了時に呼ばれる(3)
       @Override
       public void onActivityCreated(Bundle bundle) {
           super.onActivityCreated(bundle);
           hc.passList(); ★HTTP通信&JSONデータ取得メソッド★
           System.out.println("あああ");
           System.out.println(lists);
           System.out.println("いいい");
           setListAdapter(new ArrayAdapter<String>(getActivity(),
                   android.R.layout.simple_list_item_activated_1,
                   lists)); ②JSONデータが入る予定の配列
           getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
           getListView().setBackgroundColor(Color.LTGRAY);
           if (isTablet(getActivity())) showDetails(0);
       }
       //リスト要素クリック時に呼ばれる
       @Override
       public void onListItemClick(ListView l, View v, int pos, long id) {
           showDetails(pos);
       }
       //詳細の表示
       private void showDetails(int index) {
           Context context = getActivity().getApplication();
           //フラグメントの切り換え(4)
           if (isTablet(context)) {
               getListView().setItemChecked(index, true);
               if (pos == index) return;
               DetailActivity.DetailsFragment fragment =
                       DetailActivity.DetailsFragment.newInstance(index);
               FragmentTransaction ft = getFragmentManager().beginTransaction();
               ft.replace(R.id.details, fragment);
               ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
               ft.commit();
               pos = index;
           }
           //アクティビティの起動
           else {
               getListView().setItemChecked(index, false);
               Intent intent = new Intent(context, DetailActivity.class);
               intent.putExtra("index", index);
               getActivity().startActivity(intent);
           }
       }
    @Override
       public void callbackMethod(){ ③コールバック関数★Viewに配列(lists)を渡す処理を書きたいです★
           System.out.println( "コールバック成功!");
       }
   }
   //タブレットかどうかの取得(5)
   public static boolean isTablet(Context context) {
       return (context.getResources().getConfiguration().screenLayout&
               Configuration.SCREENLAYOUT_SIZE_MASK) ==
               Configuration.SCREENLAYOUT_SIZE_XLARGE;
   }
}
```
一応、載せておきます。
CallHttp.java
```Java
public class CallHttp {
   //コールバックインターフェース作成
   public interface CallHttpCallbacks {
       public void callbackMethod();
   }
   //コールバック対象クラス指定用インスタンス生成
   private CallHttpCallbacks _callHttpCallbacks;
   //コールバック対象クラス指定メソッド
   public void setCallbacks(CallHttpCallbacks callHttpCallbacks) {
       _callHttpCallbacks = callHttpCallbacks;
   }
   public void method() {
       _callHttpCallbacks.callbackMethod();
   }
}
```
よろしくお願いします。
  • Java

    23437 questions

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

  • Android

    9983 questions

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

  • コールバック

    49 questions

    コールバックは他のコードに引数として渡されるコードのことを指します。

思考するエンジニアのためのQ&Aサイト「teratail」について詳しく知る