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

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

ただいまの
回答率

90.52%

  • Java

    13767questions

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

  • Android Studio

    3696questions

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

viewpagerの設定とその回りの処理について

解決済

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 332

rvsezuki

score 58

http://qiita.com/Yuki_Yamada/items/6d8b38effeb38ed96d78
に書いてある通りにlistview,viewpager,tablayout,等を設定しました。

(実現したいこと)
タブが3つありlistviewにtab1の内容をセットして表示します。タブをクリックするなり横スワイプするなりしてtab2に来ればlistvewにtab2の内容をセットして表示したい。
(現在のコード)

SectionsPagerAdapter sectionsPagerAdapter = new SectionsPagerAdapter(getSupportFragmentManager());
ViewPager viewPager = (ViewPager) findViewById(R.id.viewPager);
viewPager.setAdapter(sectionsPagerAdapter);
tabLayout.setupWithViewPager(viewPager);

  //viewpagerと連携させる時
        tabLayout.getTabAt(0).setText("テスト1");
        tabLayout.getTabAt(1).setText("テスト2");
        tabLayout.getTabAt(2).setText("テスト3");




    public class SectionsPagerAdapter extends FragmentPagerAdapter {

        public SectionsPagerAdapter(FragmentManager fm) {
            super(fm);
        }

        @Override
        public Fragment getItem(int position) {
            return MyFragment.newInstance(position + 1);
        }

        @Override
        public int getCount() {
            return 3;
        }

        @Override
        public CharSequence getPageTitle(int position) {
            return null;
        }

    }


    public static class MyFragment extends Fragment {

        private boolean mIsRequesting = false;
        private static final String ARG_SECTION_NUMBER = "section_number";

        public MyFragment() {

        }

        public static MyFragment newInstance(int page) {
            MyFragment fragment = new MyFragment();
            Bundle bundle = new Bundle();
            bundle.putInt("PAGE", page);
            fragment.setArguments(bundle);
            return fragment;
        }

        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup viewpager, Bundle savedInstanceState) {
            int page = getArguments().getInt("PAGE", 1);

            ListView listView = (ListView) inflater.inflate(R.layout.fragment_main, viewpager, false);
            int sectionNumber = getArguments().getInt(ARG_SECTION_NUMBER);

            ((appl) getActivity()).getNew(sectionNumber);

            //データを返却する
            //ここでAdapterにデータを返却などの操作を行う

            //ここで確認作業(ア)
            //loadItems();

            listView.setAdapter(sectionAdapter);

            //取得が完全に完了したら動く
            return listView;

        }
    }

        //確認作業メソッド
 private void loadItems() {


    }

(困っていること)非同期通信(AsyncTask)でlistviewにセットする内容を処理しているが非同期通信で内容を作成している間に return listViewまできてしまいnullがセットされ停止しています。
解決策としては(ア)の部分に非同期通信でtab1,tab2,tab3にセットする内容が準備できたよというloadItemsを仕込むことらしいのですが、肝心のloadItemsメソッドの中身をどう書けば良いか全然わかりません。よろしくお願いいたします。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 1

checkベストアンサー

0

あなたがloadItemsがどのようなメソッドかを説明できない以上回答は不可能です。

なにがnullなのかはわかりませんが、おそらくsectionAdapterがnullなんでしょうね。
下記の方法でいいと思いますよ。
1-初期化時は空のリストでアダプターを作り、ListViewに設定する。
2-非同期処理の完了時にアダプターを作りListViewに設定し直す。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/02/06 14:35

    そうですね  listView.setAdapter(sectionAdapter);のところで停止してしまいます。

    現在は
    (ア)TestAdapter sectionAdapter = new TestAdapter(セットされるもの);

    (イ)listView.setAdapter(sectionAdapter);
    //取得が完全に完了したら動く
    (ウ)return listView;

    となっており(イ)の部分でnullobjectとなり停止してしまいます。

    1,2はどのように実装すればよろしいでしょうか?
    1はまだしも2の完了時にセットというのは完了したというサインを受け取るものを書かなければいけないような...(loadItemsと同じでは...?)

    キャンセル

  • 2017/02/06 15:02

    おそらくTestAdapterのコンストラクタにnull参照の配列を渡していますね?

    1は通常通りAdapterを作ってListViewに設定してください。
    また、2はAsyncTask#onPostExecuteでAdapterを作ってListViewに設定してください。

    あと、loadItemsについては知らないので、それとどう違うかは知りません。

    キャンセル

  • 2017/02/06 15:56 編集

    コンストラクタはprivate static TestAdapter nAdapter = null;でした。

    このJavaをmain.Javaとして裏で作動している非同期通信java(以下 非.Java)と呼ぶ。

    (ア)TestAdapter sectionAdapter = new TestAdapter(listrow1つ1つに設定);

    (イ)listView.setAdapter(sectionAdapter);

    //取得が完全に完了したら動く
    return listView;

    (ア)の部分に
    emptyView をセットということでしょうか?


    よろしくお願いいたします。

    キャンセル

  • 2017/02/06 17:53

    ちょっとなに言ってるかわからないので、下記のことだけに答えてください。他の情報はとりあえずいらないです。
    ・nAdapterにインスタンスを入れているところを省略せずに書いてください。
    ・sectionAdapterとnAdapyerはどのような関係か具体的に書いてください。
    ・sectionAdapterにインスタンスを入れている箇所を省略せずに書いてください。

    キャンセル

  • 2017/02/06 18:11

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup viewpager, Bundle savedInstanceState) {
    int page = getArguments().getInt("PAGE", 1);

    ListView listView = (ListView) inflater.inflate(R.layout.fragment_main, viewpager, false);
    int sectionNumber = getArguments().getInt(ARG_SECTION_NUMBER);

    ((appl) getActivity()).getNewsRss(sectionNumber, true, true);
    //データを返却する

    NewsAdapter sectionAdapter = new NewsAdapter(getContext(), R.layout.listrow,
    appl.newList[sectionNumber]);
    listView.setAdapter(sectionAdapter);
    return listView;
    }


    何言ってるのかわからない部分の
    emptyViewセットとは
    ここでlistrowに1つずつ内容をセットしているので、まずここで空をセットするのか?
    という質問でした。

    キャンセル

  • 2017/02/06 18:29

    appl.newList[sectionNumber]がnullなんですね。この変数はなんですか?宣言を書いてください。
    nAdapterとsectionAdapterは同じものですね?そしてこの変数はapplという謎の共有クラスにstatic変数として宣言されている。
    この辺を具体的に書かない限り回答なんてできないですよ。

    キャンセル

  • 2017/02/06 19:12

    private static NewAdapter nAdapter = null;
    public static ArrayList<NewClass>[] newList = new ArrayList[3];

    キャンセル

  • 2017/02/06 19:16

    ArrayList<NewClass>[] newListの全要素を空のArrayList<NewClass>で初期化してください。

    キャンセル

  • 2017/02/06 19:45

    ちょっと色々試してみます。ありがとうございました。

    キャンセル

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

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

関連した質問

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

  • Java

    13767questions

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

  • Android Studio

    3696questions

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