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

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

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

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

Android Studio

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

Q&A

解決済

1回答

2096閲覧

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

rvsezuki

総合スコア66

Java

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

Android Studio

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

0グッド

0クリップ

投稿2017/02/06 02:36

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メソッドの中身をどう書けば良いか全然わかりません。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

投稿2017/02/06 03:07

yona

総合スコア18155

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

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

rvsezuki

2017/02/06 05:35

そうですね  listView.setAdapter(sectionAdapter);のところで停止してしまいます。 現在は (ア)TestAdapter sectionAdapter = new TestAdapter(セットされるもの); (イ)listView.setAdapter(sectionAdapter); //取得が完全に完了したら動く (ウ)return listView; となっており(イ)の部分でnullobjectとなり停止してしまいます。 1,2はどのように実装すればよろしいでしょうか? 1はまだしも2の完了時にセットというのは完了したというサインを受け取るものを書かなければいけないような...(loadItemsと同じでは...?)
yona

2017/02/06 06:02

おそらくTestAdapterのコンストラクタにnull参照の配列を渡していますね? 1は通常通りAdapterを作ってListViewに設定してください。 また、2はAsyncTask#onPostExecuteでAdapterを作ってListViewに設定してください。 あと、loadItemsについては知らないので、それとどう違うかは知りません。
rvsezuki

2017/02/06 07:04 編集

コンストラクタはprivate static TestAdapter nAdapter = null;でした。 このJavaをmain.Javaとして裏で作動している非同期通信java(以下 非.Java)と呼ぶ。 (ア)TestAdapter sectionAdapter = new TestAdapter(listrow1つ1つに設定); (イ)listView.setAdapter(sectionAdapter); //取得が完全に完了したら動く return listView; (ア)の部分に emptyView をセットということでしょうか? よろしくお願いいたします。
yona

2017/02/06 08:53

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

2017/02/06 09: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つずつ内容をセットしているので、まずここで空をセットするのか? という質問でした。
yona

2017/02/06 09:29

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

2017/02/06 10:12

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

2017/02/06 10:16

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

2017/02/06 10:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問