web-dev-qa-db-ja.com

RecyclerViewonBindViewHolderが1つのアイテムに対して複数回呼び出されました

しばらくの間、RececlerViewViewHolderパターンを使用しました。カスタムAdapterを実装しています。

私は私のコードで特定のバグヘルプを検索していません。

リストの最後までスクロールして上にスクロールしているときに、onBindViewHolderメソッドが(同じアイテムに対して)複数回呼び出されるのが普通であるかどうか疑問に思っていました。この場合、アイテム0と1に対してonBindViewHolderが再度呼び出されます(リストには合計7つのアイテムが含まれます)

Datasatが変更されたことを通知せずに、このメソッドが再度呼び出される可能性はありますか?

私は少し混乱しています。

よろしく、パーム

7
Palm

はい、RecyclerViewonBindViewHolder()を複数回呼び出すことは完全に正常です。

RecyclerViewは、画面全体に表示するのに必要な最小数のViewsのみを作成します。また、古い/作成されたViewsを再利用することで機能します。そのため、下にスクロールすると、上にスクロールしているときに非表示になっていたビューが削除され、最後に表示されたViewの横に表示され、そこに追加されます。ただし、Viewは現在古いデータにバインドされているため、onBindViewHolder()が再度呼び出され、レンダリング前にViewが正しいデータのみにバインドされていることを確認します。

同様に、onCreateViewHolder()は必要なViewsの正確な最小数のみと呼ばれることに気付くでしょう。

RecyclerViewがどのように機能するかをよりよく理解するために、Recycler、LayoutManager、およびRecycler.AdapterのRecyclerViewの3つのコア部分を読むことをお勧めします。

7
Abbas