developer.android.comがRecyclerViewについて話していること

こんにちは、ハラジテリ! この投稿は 、私に記事を書くように促しました(あるいは、その地域の急激な局所温度上昇の感じ...うーん、通常、インターネットで誰かが間違っているときに起こる腰痛)。







最初から始めましょう。 「アクティビティのライフサイクルと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つのオプションがあります。









どこで、どのように?



要素を使用すると、どのような段階で行うのが適切ですか?









それがすべてのようです。 何も忘れずに混ぜていないことを願っていますが、鼻を突いて恥ずかしがらないでください。








All Articles