`` `
@Override
public View getView(int position、View convertView、ViewGroup parent){
View view = null;
ViewHolder viewHolder = null;
//最初に定義されたコントロールを配置する内部クラスを作成し、次にifステートメントで変換ビューが空であるかどうかを判断します。最初は空にする必要があります。次にidをバインドします
if(convertView == null){ //ビュー ビューのインスタンス化= LayoutInflater.from(context).inflate(R.layout.richang_item、null); viewHolder = new ViewHolder(); viewHolder.tv = view.findViewById(R.id.richang_item_list_tv ); //パッケージ viewHolderview.setTag(viewHolder); } else { // 2回目に直接判断する場合、変換ビューは空ではありません 。このステップを直接実行するだけですview = convertView; viewHolder =(ViewHolder)view.getTag(); } //割り当て
viewHolder.tv.setText(dailyList.get(position).getClassifyName());
ビューを返す;
}
`` `
https://blog.csdn.net/u012954720/article/details/80664943
https://blog.csdn.net/u012954720/article/details/80686747
#### ListViewのコアは、layoutChildren関数
makeAndAddView ---- obtainView ---- adapter.getViewです。ビューを取得したら、setupChildを使用してListViewに追加し、所定の位置に配置します(子供自身のメジャーを含む)
#### RecycleBinの
RecycleBinmActiveViews:現在画面に表示されているビュー
mScrapViews:画面からスライドするビューを保存します。mViewTypeCount> 1の場合、ScrapViews配列には複数の値があり、1つのタイプのアイテムが個別にキャッシュされます。
mCurrentScrap:mScrapViewsと同様に、mViewTypeCount = 1です。つまり、listViewにアイテムのタイプが1つしかない場合(ヘッダーとフッターを除く)、アイテムはmCurrentScrapに格納されます。
mViewTypeCount:現在のListViewアイテムのタイプ
#####ビューの作成と再利用は、主にgetViewで実装されます
##### LsitViewを表示するためのRecyclerBinリサイクルおよびバッファリングメカニズム
前に、現在画面に表示されているビューをfillActiveViewsメソッドに保存します。次に、detachAllViewsFromParent()メソッドを呼び出します。これにより、ListView内のすべての子ビューがクリアされ、2番目のレイアウトプロセスが実行されないようになります。重複データを生成します。
RecycleBinのfillActiveViews()メソッドは子ビューをキャッシュするために使用され、これらのキャッシュされたビューは後でロードするために使用され、膨張プロセスは再度実行されないため、効率に明らかな影響はありません。
####スライドプロセス
incrementalDeltaYは、Y軸上のトリガーイベントのオフセットを表します。その符号に従って上下にスライドします。deltaYは、指から現在の指の位置までの距離を表します。
画面からスライドしようとしているデータについては、RecycleBinのaddScrapViewメソッドを使用してキャッシュし、detachViewsFromParentを呼び出して画面外のビューを切り離します。
画面上のビューの場合、fillGapメソッドに従ってfillDownまたはfillUpを呼び出し、次にmakeAndAddViewを呼び出し、次にobtinViewを呼び出してビューを取得し、最後にsetupChildを使用してattachViewToParentまたはaddViewInLayoutメソッドを介してビューを画面に追加します。
#### setAdapter
ListViewのsetAdapterメソッドは、最初に前のアダプターの関連する設定をクリアし、次にデータオブザーバーをリセットしてから、requestLayout()を呼び出します。
####
再描画するnotifyDataSetChangedrequestLayoutメソッド
### ListViewの最適化
#### contentView
を再利用しても、毎回新しいgetView ()が作成されるわけではなく、getViewメソッドが複雑になりすぎないようにする必要があります。ListViewの基本原則は、ビューを再利用することです。ビューを幅と高さを変更せずに再利用すると、ビューを再利用することで、キャッシュの再割り当てによって頻繁に発生するメモリの割り当て/再利用を減らすことができます。
#### ViewHolderの最適化された使用
ViewHolderの理由は、findViewByIdメソッドに時間がかかるためです。コントロールが多すぎると、パフォーマンスに深刻な影響があります。ViewHolderは、主にこの時間を節約するために使用されます。setTagおよびgetTagを介して直接ビューを取得します。
####アイテムビューのレイアウトレベルを下げる
これは、すべてのレイアウトが従う必要があることです。レイアウトレベルが深すぎると、ビューの測定と描画に直接時間の浪費につながります。
####画像の読み込みでは、毎回の再読み込みを回避するために3レベルのキャッシュが採用されています。
####リストビューのスライドをよりスムーズにするために、ハードウェアアクセラレーションを有効にしてみてください。
### RecyclerView
mAttachedScrap:画面に表示されたアイテムをキャッシュするために使用されるViewHolder
mCachedViews:これははるかに重要です。スライドプロセスでのリサイクルと再利用が最初に処理されます。このリストが最初に処理されます。このコレクションに保存されているViewHolderの元のデータ情報はすべてそこにあるため、RecyclerViewに直接追加して表示できます。繰り返す必要はありません。 Re-onBindViewHolder()
RecyclerViewPool
####回復と再利用のプロセス
mCachedViewsのデフォルトサイズは2で、RecyclerViewPoolは5です。
mCachedViewsの優先度はRecyclerViewPoolの優先度よりも高く、リサイクル時に最新のViewHolderがmCachedViewsに配置されます。いっぱいになると、削除されてViewPoolにスローされ、最新のViewHolderをキャッシュするためのスペースが確保されます。
再利用する場合、mCachedViewsでViewHolderを見つけるのも最初ですが、さまざまな一致条件が必要です。要約すると、元のカード位置のみがmCachedViewsに格納されているViewHolderを再利用できます。mCachedViewsにない場合は、ViewPoolに移動して見つけます。
ViewPoolのViewHolderは、新しいViewHolderと同じです。タイプが同じで見つかった場合は、それを取り出して再利用し、データを再バインドできます。
リサイクルする前に再利用する
###最適化計画と使用スキル
#### recyclerView.setHasFixedSize(true)
アイテムの高さが固定されている場合、このプロパティをtrueに設定すると、特にRecyclerViewにアイテムが挿入または削除されている場合に、パフォーマンスを向上させることができます。
アイテムの数が変わると、RecyclerViewは各アイテムを再測定してレイアウトします。setHasFixedSize(true)が設定されている場合、アイテムの幅と高さが固定されているため、アダプターのコンテンツが変更されても、RecyclerViewはレイアウト全体を再描画しません。
#### getExtraLayoutSpaceを使用して、LayoutManagerの予約スペースを増やします。RecyclerView
の要素が比較的高く、1つの画面に表示できる要素が1つだけの場合、2番目の要素への最初のスライドがフリーズします。
RecyclerView(およびListView、GridViewなどの他のアダプターベースのビュー)は、キャッシュメカニズムを使用して子ビューを再利用します(つまり、システムは画面の表示範囲内の要素のみをメモリに保存し、スクロール時にこれらのメモリを継続的に再利用します。新しいビューではなく、既存のビュー)
このメカニズムは問題を引き起こす可能性があります。アプリケーションの起動後、画面の表示範囲に表示されるカードが1つしかない場合、スクロールすると、RecyclerViewは再利用可能なビューを見つけることができず、新しいビューを作成するため、にスライドします。 2番目のフィードには一定の遅延がありますが、この時点でRecyclerViewにはすでに再利用可能なビューがあるため、2番目のフィード後のスクロールはスムーズです。
この問題を解決する方法を、実際には、唯一getExtraLayoutSpace()メソッドを書き換える必要がある
`` `
LinearLayoutManager linearLayoutManager =(本)新しいLinearLayoutManagerを{ @Overrideは 保護INT getExtraLayoutSpace(RecyclerView.State状態){ リターン300; } }; `
#### RecyclerViewデータのプリフェッチ
####あまりにも多くのオブジェクトを作成しないでください
####部分更新
notifyItemChanged(int position)
notifyDataSetChanged()を使用する必要がある場合は、mAdapter.setHasStableIds(true)を設定するのが最適です。
#### onScrollイベントをオーバーライドする
多数の画像を含むRecyclerViewの場合、スライドして一時停止した後にロードします
### RecyclerViewとListViewの比較
レベル2キャッシュ
レベル4キャッシュ
### RecyclerViewとListViewのキャッシュメカニズムの違い
###リストビューの高さを変更するにはどうすればよいですか?
`` `
ViewGroup.LayoutParams params = listView.getLayoutParams();
params.height = totalHeight;
listView.setLayoutParams(params);
`` `
### listviewとrecyclerviewがプルアップされてロードされたら、どうすればよいですか?
### RecyclerViewのサイドスライド削除を実装するにはどうすればよいですか?
### RecyclerViewのItemTouchHelperの実現原理
### RecyclerViewスライディング制御ノート
https://www.jianshu.com/p/e8117855c6a0
https://www.jianshu.com/p/055fa3cb964e
https://www.jianshu.com/p/d8379a77a782
]
recyclerviewのパフォーマンスの最適化
https://www.jianshu.com/p/eabb00c500ef
複雑なデータ処理操作を可能な限り非同期にする
ようにしてください
。RecyclerViewのレイアウトを最適化し、ConstraintLayoutでの使用を避けてください。ItemViewの高さが固定されている場合は
、UIとしてsetHasFixSize(true)を使用できます。タブフィードストリームの場合は、RecycledViewPoolを使用して、複数のRecyclerViewのキャッシュ共有を実現することを検討できます。
ビューホルダークラスを使用すると、コントロールを見つける回数が減り(findviewbyid()回)、ホルダーをビューにバインドして(.setTag()、. getTag())を実現します。
コントロール間のリンクを実現
動作
ListViewは、RecyclerBinのリサイクルメカニズムを使用して、軽量リストを表示する際の効率を高めます。
listviewとrecyclerviewの違い
1. recyclerview機能はより強力で、垂直、水平、グリッドビュー、ウォーターフォールフロー、部分更新、部分削除、およびアニメーションをサポートします
2.リストビューはビューホルダーをカスタマイズする必要があります。リサイクラービューはすでにビューホルダーを定義しています。
3.キャッシュ