1

私のアプリのUIには、ツイートのタイムラインを表示するListViewがあり、OnItemLongClickListenerいくつかのボタン([返信]、[リツイート]、[お気に入り]など)で別のビューを表示するように設定されています。アダプタのgetView()メソッド内。

必要なもの:テストプロジェクトでは、タイムラインの最初の項目をロングクリックしてから、ボタンの1つをクリックして、この機能をテストしたいと思います。

コードの一部は次のようになります。

timelineList.getChildAt(0).performLongClick();
favoriteBtn = (ToggleButton)timelineList.getAdapter().getView(0, null, timelineList).findViewById(cse.ust.twittermap.R.id.favorite);
favoriteBtn.performClick();
favoriteBtn.performClick();
timelineList.getChildAt(0).performLongClick();

これは機能しますが、2行目を次のように変更しようとすると次のようになります。

timelineList.getChildAt(0).findViewById(cse.ust.twittermap.R.id.favorite);

nullfindViewById()を返すため、テストプロジェクトはNullPointer例外をスローします。

私の質問:ListAdapter#getView()との違いは何ListView#getChildAt()ですか?

どちらもリスト内のアイテムビューへの参照を返すことができるようですが、明らかにそれらの間にはいくつかの違いがあるはずです。getChildAt()また、2行目のメソッドがIDによるビューの検索に失敗する理由を理解したいと思います。

4

1 に答える 1

2

getChildAt特別な方法ではありませんListView。それぞれに実装されていますViewGroup(子を持つことができるビュー)。

あなたListViewが作成されたとき、それは子供を持っていません。アダプタのgetViewメソッドを呼び出してもその事実は変わりません。子は追加されません。

アクティビティのコンテンツが測定およびレイアウトされた場合にのみ、ListViewアダプタのgetViewメソッドを繰り返し呼び出し、返さViewsれた子のリストに返されたものを追加することで、子ビューの作成を開始します。その後になって初めて、ListView.getChildAt(x)null以外の値を返すことができます。

このメソッドは、ListView / GridView / etcに代わってListAdapter.getView真新しいViews(または単にリサイクルされた)を返します。Viewコードは決してListAdapter.getViewそれ自体を呼び出さないでください(ユニットテストを行わない限り)。

ListView.getChildAtすでに作成された(に代わってView以前に作成された)を返します。多くのリスト項目(によって返される値)を定義できますが、アダプタをホストすることで、画面にいつでも表示できるよりも多くの子が存在することはありません。 。つまり、1000個のリストアイテムを処理できますが、子が6個を超えることはありません(もちろん、画面のサイズとリストビューアイテムによって異なります)。ListAdapter.getViewListViewListAdpatergetCountListViewListAdapterListViewViews

于 2013-03-27T13:44:44.730 に答える