ページ 11

androidプログラミングで質問です

Posted: 2013年2月03日(日) 20:52
by ひよつこ
どうも、こんにちは。
さっそくですが質問させていただきます。

現在ListViewにaddHeaderView()でヘッダーをつけようとしています。
しかし、
mListView = (ListView) findViewById(リストビューのID);
mListView.addHeaderView(new ListView(this));
とするとエラーが発生しませんが、
mListView = (ListView) findViewById(リストビューのID);
mHeader = findViewById(ヘッダーのID);
mListView.addHeaderView(mHeader);
とすると強制終了します。
Eclipseでも特にミスは指摘されません。
いったい何が原因なのでしょうか。

※WindowsでEclipseを使っています。

Re: androidプログラミングで質問です

Posted: 2013年2月03日(日) 21:21
by beatle
Android ListView addHeaderView() nullPointerException for predefined Views
が参考になります。

上記URLの解答の内容によると、結論から言うと

コード:

mListView = (ListView) findViewById(リストビューのID);
mHeader = findViewById(ヘッダーのID);
mListView.addHeaderView(mHeader);
は出来ないそうです。

解答を参考にすれば、以下のように修正することで動くらしいです。

コード:

mListView = (ListView) findViewById(リストビューのID);
mHeader = getLayoutInflater().inflate(ヘッダーのID,null); // この行を修正。getLayoutInflater()を使う。
mListView.addHeaderView(mHeader);
お試しあれ。

Re: androidプログラミングで質問です

Posted: 2013年2月07日(木) 23:22
by ひよつこ
返信ありがとうございます。
早速、getLayoutInflater().inflate(ヘッダーのID,null)で実行してみましたが、
また強制終了してしまいました。

LogCatをみたところ
Resource ID ヘッダーのID type #0x12 is not valid
とあり NotFoundException が投げられているようです。

どうか解決よろしくお願いします。

Re: androidプログラミングで質問です

Posted: 2013年2月08日(金) 00:18
by ISLe
LayoutInflater#inflateにはレイアウトのIDを指定します。

Re: androidプログラミングで質問です

Posted: 2013年2月09日(土) 11:46
by ひよつこ
返信ありがとうございます。

inflate(レイアウトのID,null)としたところ強制終了せずに実行できました。
しかし、ヘッダーにリスナーをつけられなくなりました。
レイアウトをヘッダーにしてしまうとonClickListenerなどのリスナーを設定できないのでしょうか。

Re: androidプログラミングで質問です

Posted: 2013年2月09日(土) 17:04
by ISLe
ひよつこ さんが書きました:しかし、ヘッダーにリスナーをつけられなくなりました。
レイアウトをヘッダーにしてしまうとonClickListenerなどのリスナーを設定できないのでしょうか。
LayoutInflater#inflateが返すViewインスタンスをたどればヘッダーのインスタンスを取得できます。

コード:

mHeaderLayout = getLayoutInflater().inflate([ヘッダーを含むレイアウトのID], null);
mHeader = mHeaderLayout.findViewById([ヘッダーのID]);
こんな感じでヘッダーのViewインスタンスを取得できるはずなので、mHeaderにリスナーを登録します。

Re: androidプログラミングで質問です

Posted: 2013年2月09日(土) 19:16
by ひよつこ
返信ありがとうございます。
無事にヘッダーを表示し、リスナーをつけることができました。

そこで、あと一つだけ質問したいのですが、
登録したヘッダーの表示,非表示を動的に変えることはできるでしょうか。
mHeader.setVisibility(View.GONE) としてもListViewに空欄が残ってしまいます。
なので、空欄も残らない方法はあるのでしょうか。

Re: androidプログラミングで質問です

Posted: 2013年2月09日(土) 22:54
by ISLe
ListViewのヘッダはヘッダといってもリストアイテムのひとつなので、取り除くにはListView#removeHeaderViewを使うしかないと思います。

動的にレイアウトを変えたいなら、ListViewと並列に別のViewをヘッダとして配置するのが良いと思います。

Re: androidプログラミングで質問です

Posted: 2013年2月10日(日) 20:46
by ひよつこ
返信ありがとうございます。

removeHeaderView()では再びヘッダーを表示することができなくなってしまうのではないでしょうか。
また、ListViewと並列に別のViewを…というのはどういうことでしょうか。

Re: androidプログラミングで質問です

Posted: 2013年2月10日(日) 23:45
by ISLe
ひよつこ さんが書きました:removeHeaderView()では再びヘッダーを表示することができなくなってしまうのではないでしょうか。
再び表示したいときはaddHeaderViewすることになります。
ひよつこ さんが書きました:また、ListViewと並列に別のViewを…というのはどういうことでしょうか。
ListViewを配置したレイアウトがありますよね。
そのレイアウトで、ListViewの上にViewを配置してそのViewをヘッダの代わりにするということです。

Re: androidプログラミングで質問です

Posted: 2013年2月11日(月) 17:00
by ひよつこ
返信ありがとうございます。
目的の動作をさせることができました。
次回もよろしくお願いします。