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

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

ただいまの
回答率

88.03%

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

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 2,032

score 409

前提・実現したいこと

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

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

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

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

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

ログを載せます。

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メソッド内にコールバック関数を仕込みました。

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(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がコールバック関数です。

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(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

public class CallHttp {

    //コールバックインターフェース作成
    public interface CallHttpCallbacks {
        public void callbackMethod(List<String> lists); ★変更(引数設置)★
    }

    //コールバック対象クラス指定用インスタンス生成
    private CallHttpCallbacks _callHttpCallbacks;

    //コールバック対象クラス指定メソッド
    public void setCallbacks(CallHttpCallbacks callHttpCallbacks) {
        _callHttpCallbacks = callHttpCallbacks;
    }

}

よろしくお願いします。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

check解決した方法

0

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

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

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

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

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

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

Before

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

After

        public void setListAdapterMethod(List<String> lists){
            System.out.println(lists);
            setListAdapter(new ArrayAdapter<String>(getActivity(),
                    android.R.layout.simple_list_item_activated_1,
                    lists));
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            getListView().setBackgroundColor(Color.LTGRAY);
            if (isTablet(getActivity())) showDetails(0);
        }

★以下全コード★

Present.java

public class Present extends Activity {

 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

    //リストフラグメントの生成(2)
    public static class TitlesFragment extends ListFragment implements CallHttp.CallHttpCallbacks {

 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜

        //アクティビティ生成完了時に呼ばれる(3)
        @Override
        public void onActivityCreated(Bundle bundle) {
            super.onActivityCreated(bundle);

            hc.passList();
            System.out.println("あああ");
            System.out.println(lists);
            System.out.println("いいい");
            setListAdapterMethod(lists); ★メソッド化★
        }

 〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜〜


        public void callbackMethod(List<String> lists){
            System.out.println( "コールバック成功!");
            System.out.println(lists);
            setListAdapterMethod(lists); ★メソッド追加★
        }


        public void setListAdapterMethod(List<String> lists){ ★メソッド化★
            System.out.println(lists);
            setListAdapter(new ArrayAdapter<String>(getActivity(),
                    android.R.layout.simple_list_item_activated_1,
                    lists));
            getListView().setChoiceMode(ListView.CHOICE_MODE_SINGLE);
            getListView().setBackgroundColor(Color.LTGRAY);
            if (isTablet(getActivity())) showDetails(0);
        }
    }


}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 88.03%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る