web-dev-qa-db-ja.com

ArrayAdapterのgetView()メソッドの説明

ArrayAdaptergetView()メソッドについて説明してください。

ドキュメントを読みましたが、3つのパラメータがあります。

  • position:ビューが必要なアイテムのアダプターのデータセット内のアイテムの位置。
  • convertView:可能であれば、再利用する古いビュー。注:使用する前に、このビューがnullでなく、適切なタイプであることを確認する必要があります。このビューを変換して正しいデータを表示できない場合、このメソッドは新しいビューを作成できます。
    異種リストはビュータイプの数を指定できるため、このビューは常に正しいタイプになります(getViewTypeCount()およびgetItemViewType(int)を参照)。
  • parent:このビューが最終的にアタッチされる親

positionパラメーターを理解しました。彼らが言ったように、それは閲覧が要求されたアイテムの位置を意味します。

convertViewはどこから来たのですか。 convertViewがnullかどうかをチェックする例をたくさん見てきました。 isがnullの場合、行レイアウトの新しいインスタンスを膨らませ、データを入力して返します。私もそのことに頭を悩ませていると思いますが、それでも1つのことが私を困惑させます。 convertViewパラメーターを介して渡されるレイアウトは何ですか。 if resourceを初期化するときに渡されるArrayAdapterパラメータgetView()によって返された最後のレイアウトのキャッシュされたコピーはありますか?

そして最後に。 parentパラメーターは何をしますか。これを利用した例はあまり見たことがありません。それらのほとんどは、単に行レイアウトを再利用/膨張させて返します。

ListViewにオンクリックアニメーションがあるので質問しています。具体的には これはSpotifyのドロップダウンクイックアクションメニューを複製することを目的としています 。私のアニメーションは少し遅くなっています。この問題をしばらく診断した後、これは、反復ごとに新しい行レイアウトを膨らませているため、getView()メソッドの完了に少し時間がかかることが原因であることに気付きました。誰かが行レイアウトをViewHolderにキャッシュすることを提案しましたが、他の例ではconvertViewパラメーターを再利用することを示しています。つまり、convertViewがnullの場合にのみ行レイアウトを拡張します。)

21

GetView()によって返される最後のレイアウトのキャッシュされたコピーはありますか?

convertViewは、画面を離れた行のビューです(したがって、getViewメソッドによって返される最後のビューではありません)。たとえば、リストが最初に表示されます。この場合、convertViewnullであり、行ビューは以前に作成されておらず、画面から離れています。下にスクロールすると、行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);
44
Luksprog

convertViewについての私の理解は、現在使用されていないためにリサイクルされたビューであるということです。たとえば、リストを下にスクロールすると、一番上のビューは画面に表示されません。したがって、新しいビューが必要なときに使用するために、これらはこのパラメーターに渡されます(したがって、未使用のビューをアイドル状態にしたまま、まったく新しいビューを作成する必要はありません)。 iOSには、dequeueReusableCellWithIdentifierと呼ばれる同様のメソッドがあります。リストビューの各行が同じ構造である場合は、これを適切なタイプにキャストして、テキストや画像などの情報を更新するだけで安全です。これは、以前にgetView()によって返されたビューになります。同じリストを要求します。

parentに関する私の最良の推測(そして確かに推測です)は、このアダプターのリストが子であるという見方です。リストの親ビューに情報を渡したり、リストの親ビューから情報を受け取ったりするために、コンテキスト、リソースシステムへのアクセスが必要な場合は、レンダリングシステムに戻るルートを提供します。

2
Xono