カスタムArrayAdapterの作成について学んでおり、ArrayAdaptergetViewTypeCountとgetItemViewTypeメソッドのオーバーライドに慣れてきました。
Android View API が によって返される「可能なビュー タイプの数」を気にするのはなぜgetViewTypeCountですか? そして、プログラマーとして、なぜ気にしなければならないのでしょうか?
カスタムArrayAdapterの作成について学んでおり、ArrayAdaptergetViewTypeCountとgetItemViewTypeメソッドのオーバーライドに慣れてきました。
Android View API が によって返される「可能なビュー タイプの数」を気にするのはなぜgetViewTypeCountですか? そして、プログラマーとして、なぜ気にしなければならないのでしょうか?
がどこで使用されているかを正確に確認するために、Android ソースを確認しましたgetViewTypeCount。抽象AbsListViewクラスの内部RecycleBinクラスのsetViewTypeCountメソッドにあります。
このメソッドは、のsetViewTypeCount初期サイズを指定するために使用されます。これ自体がsの 1 つであり、「ビュー タイプ カウント」ごとに 1 つです。ArrayList<View>scrapViewsArrayListArrayListArrayList<View>
さらに、によって返される値は、のメンバー変数に代入getViewTypeCountされます。このメンバーは、RecycleBin クラスの少数のメソッド全体でビューが 1 つしかない場合と多数のビューがある場合のリサイクルのロジックを制御するために使用されます (誰もが言及しているように)。RecycleBinmViewTypeCount
したがって、答えは、それgetViewTypeCountが使用されRecycleBinているため、処理するビューが1つだけなのか多数なのかを知ることができると私は信じています。いわば。
(リサイクルに目を向けてくれて、ソースを読むように動機付けてくれたみんなに感謝します。)
前の質問に対するCommonswareの回答は、なぜこれらの方法を気にする必要があるのか を非常によく説明しています。以下に小さな例を示します。
ListView100 行と 3 種類の行があります。
TextViewAnalogClockビュー_ListView次のように開始します。
これらのメソッドを実装しない場合、Android は行のタイプを考慮せずに単にビューをリサイクルします。ListViewしたがって、上記の例では、ユーザーが下にスクロールすると、リサイクルされたビュー (もう表示されていない行 0) を持つgetView行に対してメソッドが呼び出され、 (はこの位置にはありません)。ご覧のとおり、これはその位置で期待するビューではありません。メソッドには次のようなものがあるためです。5TextViewconvertViewnullgetView
//...
if (convertView == null) {
// inflate views
} else {
//just use it
//...
(非常に複雑な)はずの行にデータを設定することになりますcustom viewが、代わりに単純なものになりTextViewます。ListViewこれは、さらに上下にスクロールすると悪化します。
これらのメソッドを実装すると、android はgetViewメソッドが 3 種類の行を期待することを認識します。行 5 (前の例から) を表示する必要がある場合、android を呼び出して、メソッドがその位置 (位置 5) に期待するgetItemViewTypeビューのタイプを確認します。getViewそのタイプの再利用されたビューが見つかった場合 (以前に再利用されたもの)、getViewメソッドはconvertViewその再利用されたビューに設定されて呼び出され、そうでない場合はに設定されてgetViewが呼び出されます。をスクロールして位置 5 を表示すると、(唯一の) 再利用されたビューはシンプルになります。このメソッドは (非常に複雑な) を想定しており、そのタイプのリサイクルされたビューが見つからないため、が存在し、それを膨らませる機会が得られます。convertViewnullListViewTextViewgetViewcustom viewconvertViewnull
をスクロールしListViewて位置 6 を表示すると、位置 1 からのビュー (画面にはもう表示されていません) が再利用されるため、ListViewには異なるタイプの 2 つのビュー (TextViewおよび a custom view(非常に複雑)) が表示されます。その後、getItemViewTypeが再度呼び出され、この位置に対してgetViewメソッドには が必要TextViewです。このタイプのリサイクルされたビューが存在するため、getViewメソッドはconvertViewこのリサイクルされた に設定して呼び出されTextViewます。さらにスクロールするListViewと、getViewrequiredTextViewまたはcustom viewこれらの再利用されたビューの 1 つ (正しいタイプ) が提供されます。また、最終的に type のビューAnalogCLockがリサイクルされるため、ListView各リスト行タイプのビューがリサイクルされて再利用されます。
リファレンスには、「各型は、getView(int, View, ViewGroup) で変換できる一連のビューを表します」と記載されています。
ビューが異なる場合、互換性のない他のビューで再利用することはできません。1したがって、このメソッドが標準のリサイクル コードとは異なるものを返す場合、それonView以上機能しません。