こんにちは、ハラジテリ! この投稿は 、私に記事を書くように促しました(あるいは、その地域の急激な局所温度上昇の感じ...うーん、通常、インターネットで誰かが間違っているときに起こる腰痛)。
最初から始めましょう。 「アクティビティのライフサイクルとRecyclerViewの作業には共通点がある」ことに同意します。これは「何か」です。私たちが何をしているのか、理由を理解する必要があります。 そして、ドキュメントを読んでください。 そして、理性の夢のように、これらの2つの必需品を満たさないことは、モンスターを生み出します。 ここでのみ、前作者がこれらのモンスターと戦うことを提案している方法で、私は強く反対します。
2つの条件を検討します。
条件回数
リスナーをどこかで切る場合は、どこかで切断する必要があります。 通常、これらは対称関数で実行しますonViewAttachedToWindow
にアタッチし、 onViewAttachedToWindow
に削除しonViewDetachedFromWindow
。 onBindViewHolder
アタッチしてonBindViewHolder
ます... onBindViewHolder
はアタッチしていません。 この呼び出しは対称ではなく、さまざまな条件に応じて複数回呼び出すことができます。 あなたの人生を複雑にする必要はありません。
あなたが、元の記事の著者のように、 「しかし、リスナー内で、リスト内の要素の位置、onBindViewHolder()メソッドで利用可能でonViewAttachedToWindow()では利用できないアクセスを考慮する必要がある場合がある」という考えを持っている場合、考え抜いた。 これはできません。 本当にしたい場合でも。 ドキュメンテーションで述べられているように、要素の位置のみが変更され、その内容は変更されていない場合、このメソッドは呼び出されないため、リスナーで間違った位置を取得する危険があります。 getAdapterPosition
使用しgetAdapterPosition
。
条件番号2
RecyclerView
は非常に複雑なものです。 あなたの人生をさらに複雑にする必要はありません。 パフォーマンスの最適化に関与していない場合、この要素が一般的なプールにあるかどうかは関係ありません。
結果
これら2つの条件下では、 viewWasRecycled
フラグの形式でホイールを再発明する必要はほとんどありません。
何が起こっているの?
一般にRecyclerView
要素はどうなりますか? まず、キャッシュとプールの2つの「リポジトリ」があることに注意してください。 画面の境界を超えた要素はキャッシュに落ちますが、この要素を再リンクすることなく、いつでも再び戻ることができます(つまり、 onBindViewHolder
メソッドは呼び出されません )。 キャッシュがいっぱいになった場合、または何らかの理由で、 RecyclerView
が近い将来この要素を必要としないと判断した場合、プールに移動します(ここではonViewRecycled
が呼び出されます)。 プールから回復されたアイテムは再参照され(その位置が変更された可能性が高いため)、 onBindViewHolder
呼び出しを受け取ります。 ただし、要素がプールを離れた場合、新しい要素はサイクル全体( onCreateViewHolder
、 onBindViewHolder
、 onViewAttachedToWindow
ます。
合計で、イベントの開発には3つのオプションがあります。
- 以前は要素がありませんでした。作成、アタッチ、アタッチ。
- アイテムはプールにありました:バインド、アタッチ。
- アイテムはキャッシュ内にありました。添付するだけです。
どこで、どのように?
要素を使用すると、どのような段階で行うのが適切ですか?
-
onCreateViewHolder
。 作成、うーん、ViewHolder
。 リスナーをバインドしたり、コンテンツで埋めたりする必要はありません。 必要なタイプを決定して作成するだけです。 -
onBindViewHolder
。 実際のコンテンツバインディング(テキスト、画像)を実行します。position
パラメーターはメソッド自体でのみ使用できます。保存せず、クロージャーに送信しません。データが変更された場合、このメソッドは再度呼び出されます(位置のみが変更された場合は実行されません)。 ここでもリスナーをハングアップしません-対称性の理由から。 -
onViewAttachedToWindow
。 これで要素が画面に表示され、ユーザーは要素を操作できるようになります-リスナーをアタッチする良い機会です。 その中の要素の位置が必要な場合は、getAdapterPosition
を使用して取得することに注意してください。 -
onViewDetachedFromWindow
。 アイテムは画面に表示されません。 ユーザーはユーザーと対話できません。 リスナーを削除します。 -
onViewRecycled
。 アイテムはに送信されます地獄プール ここで、重いリソース(キャッシュされた画像など)を解放できます。 要素が再利用される場合-おそらく、別の位置に。
それがすべてのようです。 何も忘れずに混ぜていないことを願っていますが、鼻を突いて恥ずかしがらないでください。