カスタム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>
scrapViews
ArrayList
ArrayList
ArrayList<View>
さらに、によって返される値は、のメンバー変数に代入getViewTypeCount
されます。このメンバーは、RecycleBin クラスの少数のメソッド全体でビューが 1 つしかない場合と多数のビューがある場合のリサイクルのロジックを制御するために使用されます (誰もが言及しているように)。RecycleBin
mViewTypeCount
したがって、答えは、それgetViewTypeCount
が使用されRecycleBin
ているため、処理するビューが1つだけなのか多数なのかを知ることができると私は信じています。いわば。
(リサイクルに目を向けてくれて、ソースを読むように動機付けてくれたみんなに感謝します。)
前の質問に対するCommonswareの回答は、なぜこれらの方法を気にする必要があるのか を非常によく説明しています。以下に小さな例を示します。
ListView
100 行と 3 種類の行があります。
TextView
AnalogClock
ビュー_ListView
次のように開始します。
これらのメソッドを実装しない場合、Android は行のタイプを考慮せずに単にビューをリサイクルします。ListView
したがって、上記の例では、ユーザーが下にスクロールすると、リサイクルされたビュー (もう表示されていない行 0) を持つgetView
行に対してメソッドが呼び出され、 (はこの位置にはありません)。ご覧のとおり、これはその位置で期待するビューではありません。メソッドには次のようなものがあるためです。5
TextView
convertView
null
getView
//...
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 を表示すると、(唯一の) 再利用されたビューはシンプルになります。このメソッドは (非常に複雑な) を想定しており、そのタイプのリサイクルされたビューが見つからないため、が存在し、それを膨らませる機会が得られます。convertView
null
ListView
TextView
getView
custom view
convertView
null
をスクロールしListView
て位置 6 を表示すると、位置 1 からのビュー (画面にはもう表示されていません) が再利用されるため、ListView
には異なるタイプの 2 つのビュー (TextView
および a custom view
(非常に複雑)) が表示されます。その後、getItemViewType
が再度呼び出され、この位置に対してgetView
メソッドには が必要TextView
です。このタイプのリサイクルされたビューが存在するため、getView
メソッドはconvertView
このリサイクルされた に設定して呼び出されTextView
ます。さらにスクロールするListView
と、getView
requiredTextView
またはcustom view
これらの再利用されたビューの 1 つ (正しいタイプ) が提供されます。また、最終的に type のビューAnalogCLock
がリサイクルされるため、ListView
各リスト行タイプのビューがリサイクルされて再利用されます。
リファレンスには、「各型は、getView(int, View, ViewGroup) で変換できる一連のビューを表します」と記載されています。
ビューが異なる場合、互換性のない他のビューで再利用することはできません。1
したがって、このメソッドが標準のリサイクル コードとは異なるものを返す場合、それonView
以上機能しません。