ArrayAdapter
のgetView()
メソッドについて説明してください。
ドキュメントを読みましたが、3つのパラメータがあります。
position
:ビューが必要なアイテムのアダプターのデータセット内のアイテムの位置。convertView
:可能であれば、再利用する古いビュー。注:使用する前に、このビューがnullでなく、適切なタイプであることを確認する必要があります。このビューを変換して正しいデータを表示できない場合、このメソッドは新しいビューを作成できます。parent
:このビューが最終的にアタッチされる親position
パラメーターを理解しました。彼らが言ったように、それは閲覧が要求されたアイテムの位置を意味します。
convertView
はどこから来たのですか。 convertView
がnullかどうかをチェックする例をたくさん見てきました。 isがnullの場合、行レイアウトの新しいインスタンスを膨らませ、データを入力して返します。私もそのことに頭を悩ませていると思いますが、それでも1つのことが私を困惑させます。 convertView
パラメーターを介して渡されるレイアウトは何ですか。 if resource
を初期化するときに渡されるArrayAdapter
パラメータ ? getView()
によって返された最後のレイアウトのキャッシュされたコピーはありますか?
そして最後に。 parent
パラメーターは何をしますか。これを利用した例はあまり見たことがありません。それらのほとんどは、単に行レイアウトを再利用/膨張させて返します。
(ListView
にオンクリックアニメーションがあるので質問しています。具体的には これはSpotifyのドロップダウンクイックアクションメニューを複製することを目的としています 。私のアニメーションは少し遅くなっています。この問題をしばらく診断した後、これは、反復ごとに新しい行レイアウトを膨らませているため、getView()
メソッドの完了に少し時間がかかることが原因であることに気付きました。誰かが行レイアウトをViewHolder
にキャッシュすることを提案しましたが、他の例ではconvertView
パラメーターを再利用することを示しています。つまり、convertView
がnullの場合にのみ行レイアウトを拡張します。)
GetView()によって返される最後のレイアウトのキャッシュされたコピーはありますか?
convertView
は、画面を離れた行のビューです(したがって、getView
メソッドによって返される最後のビューではありません)。たとえば、リストが最初に表示されます。この場合、convertView
はnull
であり、行ビューは以前に作成されておらず、画面から離れています。下にスクロールすると、行0が画面から離れます(表示されなくなります)。その場合、ListView
は、後で使用するためにそのビューをキャッシュに保持することを選択できます(これは行として意味があります) ListView
のは通常同じレイアウトで、データのみが異なります)。一部のビューをキャッシュに保持して後で使用する理由は、getView
メソッドが何度も呼び出される可能性があるためです(ユーザーが上下にスクロールして新しい行が画面に表示されるたびに)。行ビューを再作成する必要があるたびに、これにより多くのオブジェクトが作成されることになりますが、これは避けるべきことです。 getView
メソッドでは、convertView
をチェックしてnull
かどうかを確認します。 null
の場合は、必須新しい行ビューを作成してデータを入力します。null
でない場合は、ListView
が提供します。あなたは前のビューです。この前のビューがあるということは、新しい行レイアウトを作成する必要がないことを意味します。代わりに、必須キャッシュされたビューには古いデータがまだ添付されているため、正しいデータを入力する必要があります(表示されます)ユーザーが下にスクロールしたときにListView
の行が重複している理由を尋ねるstackoverflowに関する多くの質問)。
親パラメーターは何をしますか。これを利用した例はあまり見たことがありません。それらのほとんどは、単に行レイアウトを再利用/膨張させて返します。
新しく膨らんだ/構築された行の正しいLayoutParams
を取得するために使用する必要があります。たとえば、ルートとしてRelativeLayout
を含むレイアウトを膨らませ、parent
を使用してLayoutParams
を取得しない場合、行に問題が発生する可能性があります。レイアウト。親を考慮に入れるには、次を使用します。
convertView = getLayoutInflater().inflate(R.layout.row_layout, parent, false);
convertView
についての私の理解は、現在使用されていないためにリサイクルされたビューであるということです。たとえば、リストを下にスクロールすると、一番上のビューは画面に表示されません。したがって、新しいビューが必要なときに使用するために、これらはこのパラメーターに渡されます(したがって、未使用のビューをアイドル状態にしたまま、まったく新しいビューを作成する必要はありません)。 iOSには、dequeueReusableCellWithIdentifier
と呼ばれる同様のメソッドがあります。リストビューの各行が同じ構造である場合は、これを適切なタイプにキャストして、テキストや画像などの情報を更新するだけで安全です。これは、以前にgetView()
によって返されたビューになります。同じリストを要求します。
parent
に関する私の最良の推測(そして確かに推測です)は、このアダプターのリストが子であるという見方です。リストの親ビューに情報を渡したり、リストの親ビューから情報を受け取ったりするために、コンテキスト、リソースシステムへのアクセスが必要な場合は、レンダリングシステムに戻るルートを提供します。