RecycleViewとListViewの違い(最も全(??)


書いているうちに誰かが書いているのも完璧で、RecyclerViewとListViewを見て比較分析を使うことができます.2021/02/24補足
 
1.RecycleViewの簡単な使用
主な仕事はRecycleViewを継承することです.Adapter、書き換え
1.RecyclerView.ViewHolder
2.onCreateViewHolder()は、ViewHolderインスタンスを作成し、ロードされたレイアウトをコンストラクション関数に転送し、ViewHolderインスタンスを返します.
3.onBindViewHolder()は、各サブアイテムが画面内にスクロールされたときに実行されるサブアイテムのデータを割り当てるためのものです.positionは、現在のアイテムのFruitインスタンスを取得します.
 
LayoutManagerは、RecyclerViewのレイアウトを指定します.LinearLayoutManagerとは、線形レイアウトのことです
 
一般的な使用方法:
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view); 
LinearLayoutManager layoutManager = new LinearLayoutManager(this); 
recyclerView.setLayoutManager(layoutManager); 
FruitAdapter adapter = new FruitAdapter(fruitList); recyclerView.setAdapter(adapter);

setOrientation()を呼び出してレイアウトの配列方向を水平配列に変更します.
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);

LinearLayoutManagerのほか、RecyclerViewにはGridLayoutManager(グリッドレイアウト)とStaggerdGridLayoutManager(ストリーミングレイアウト)が用意されています.
 
2.RecycleViewとListViewの違い(10点、認めない歓迎コメント)
以下を参照してください.https://www.cnblogs.com/chen-ying/p/12386712.html
>やはり自分で整理しておきましょう
(1)基礎使用
ListViewは、多重化最適化作業を完了するために、カスタムのViewとConvertViewを使用する必要がある.(setTag && getTag)
RecycleViewのRecycleView.ViewHolderは多重化されており、自分で最適化する必要はありません.
書き直す方法はきっと違うに違いない.ソースコードを見ればわかる.(getView Vs onCreateViewHolder && onBindViewHolder)
(2)レイアウト効果
RecycleViewはビューの再利用のみを管理し、レイアウトの管理全権をLayoutManagerに渡します.
LayoutManagerは抽象クラスであり、LinearlayoutManager(リニアレイアウト効果)、GridLayoutManager(グリッドレイアウト効果)、StaggerdGridLayoutManager(ストリーミングレイアウト効果)の3つの実装を提供しています.RecyclerViewではデフォルトでリニアレイアウト、メッシュレイアウト、ストリーミングレイアウトの3種類がサポートされており、LayoutManagerの構成と切り替えによって異なるレイアウト効果が得られます.レイアウトをカスタマイズしたい場合は、自分のLayoutManagerの書き換えを継承し、LayoutManagerでスクロール方向を設定してItemの位置を取得することもできます.
(3)空データビュー処理
ListViewは従来、setEmptyViewメソッドを提供しており、参照可能:androidノートのListViewのsetEmptyViewメソッドを詳細に使用する.コアコンテンツは、ListViewの同級に空のデータを表示するビューを設定し、ListViewにデータがnullであるか否かの判断を依頼し、emptyのvisibleを設定する.
RecycleViewにはsetEmptyViewメソッドがなく、自分で実現する必要があります.参考:RecyclerViewにはEmptyViewが追加されています.コアコンテンツは、RecycleViewでAdapterDataObserverを書き換えて登録し、データが変化したときにデータがnullであるかどうかを判断し、RecycleView自体およびEmptyViewの表示と非表示を設定することです.
(4)HeaderViewとFooterView
ListViewでは、addHeaderView()とaddFooterView()を使用して、ドロップダウン・リフレッシュまたはプルアップ・ロードを実現する必要がある場合に、ヘッダitemとボトムitemを追加できます.また、この2つのAPIはAdapterの作成に影響しません.
使用時に注意すべきことは、addHeaderViewとaddFooterViewです.
RecycleViewにはこの2つのAPIはありませんが、Adapterで書くことができ、ViewHolderのTypeとViewに基づいて自分のHeader、Footterと普通のitemを実現しますが、これはAdapterに影響し、変更が大きくなります.(これはよくあるやり方です)
参照:RecyclerViewヘッダテール追加方法は、Header&Footerの2種類のViewを追加し、3種類のタイプ(TYPE_HEAD&TYPE_FOOTER&TYPE_NORMAL)を設定し、getItemViewを複写し、getItemCount&onCreateViewHolder&onBindViewHolderを修正することが原理です.
onCreateViewHolder(ViewGroup parent, int viewType)

このメソッドのviewTypeはgetItemViewTypeで設定されています.詳細はリンクを参照してdemoを書いてみてください.
(5)アニメーション効果
ListViewはitemにアニメーションを提供していないので、自分で実現する必要があります.具体的には、listviewにitemアニメーションを追加することを参照してください.
全体をアニメート:
listView.setLayoutAnimation(getAnimationController());  

RecycleViewはitemにデフォルトのアニメーションを提供しています:DefaultItemAnimatorは、RecycleViewを使用しているときに削除すると、アニメーション効果が明らかになります.アニメーションを深く研究またはカスタマイズするには、「DefaultItemAnimatorのカスタマイズ」を参照してください.
 
(6)ローカルリフレッシュ
ListViewのリフレッシュnotifyDataSetChangedでは、すべてのitemが再描画されるため、ローカルリフレッシュには適用されません.質問ですが、ListViewはどのようにローカルにリフレッシュしますか?
a.公式推薦方式:
public View getView(int position, View convertView, ViewGroup parent) { 

//         View,    getView   
View view = listView.getChildAt(position- listView.getFirstVisiblePosition()); 
getView(position, view, listView);

b.大衆的な方法:(Adapterにローカルリフレッシュを追加する方法)
public void updateItem(ListView mListView, int posi) {
    if (mListView != null) {
        //         item
        int visiblePos = mListView.getFirstVisiblePosition();
        //         position      ,          item  
        int offset = posi - visiblePos;
        int lenth = mListView.getChildCount();
        //           ,           Tag,      ,            
        if ((offset < 0) || (offset >= lenth)) return;
        View convertView = mListView.getChildAt(offset);
        ViewHolder viewHolder = (ViewHolder) convertView.getTag();
        //   view||viewholder,              
        // Tips:        
    }
}

RecycleViewはローカルリフレッシュの方法を提供する:notifyItemChanged、ソースコードは以下の通りである.
public final void notifyItemChanged(int position) {
    mObservable.notifyItemRangeChanged(position, 1);
}

 
(7)ItemTouchHelper(ドラッグ&スリップの実現)
ItemTouchHelperは、Recycleviewのドラッグ&スリップを支援するツールクラスです.
// 1.       ItemTouchHelper.Callback
public class ItemTouchHelperCallback extends ItemTouchHelper.Callback{
    //   getMovementFlags()                    
    @Override
    public int getMovementFlags(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder) {
        final int dragFlags = ItemTouchHelper.UP | ItemTouchHelper.DOWN;
        final int swipeFlags = ItemTouchHelper.START | ItemTouchHelper.END;
        return makeMovementFlags(dragFlags, swipeFlags);
    }

    @Override
    public boolean onMove(RecyclerView recyclerView, RecyclerView.ViewHolder viewHolder, RecyclerView.ViewHolder target) {
        mRecyclerAdapter.onItemMove(viewHolder.getAdapterPosition(), target.getAdapterPosition());
        return false;
    }

    @Override
    public void onSwiped(RecyclerView.ViewHolder viewHolder, int direction) {
        mRecyclerAdapter.onItemDismiss(viewHolder.getAdapterPosition());
    }
}
// 2.    RecycleView   
    ItemTouchHelper mItemTouchHelper = new ItemTouchHelper(new ItemTouchHelperCallback());
    mItemTouchHelper.attachToRecyclerView(mRecyclerView);
//     
// onItemMove    notifyItemMoved(fromPosition, toPosition);        

以上で、Recycleviewの横滑りやドラッグのアニメーション効果を簡単に実現できます.
しかし、ListViewではこのような方法は提供されていません.ListViewの横滑りとドラッグを実現するには、ListViewのドラッグと横滑り実現(WindowManagerでドラッグを実現し、ViewDragHelperで横滑りを実現する)を参考にすることができます.
 
(8)クリックイベント
ListViewではsetOnItemClickListener,setOnItemLongClickListener,setOnItemSelectedListenerなどの方法が用意されているが,ヘッダとfooterを設定した配列の境界を越える問題が考えられる.
Recycleviewではこれらのメソッドは提供されていないため、viewHolderを使用してサブアイテムに特定のリスニングを設定する必要があります.(よく見かけますが、コードは貼っていません)
 
(9)ネストスクロール機構
Androidタッチイベント配信メカニズム:Touchイベントは配信時に親Viewから子Viewに伝達され、ある子Viewが受信して処理を開始すると、次のすべてのイベントがこのViewで処理され、そのView Groupは次の指が押されるまでこれらのイベントを受信しません.ネストされたスクロールメカニズム(NestedScrolling)は、このメカニズムの不足を補うために、子Viewが親Viewと同時にTouchイベントを処理できるようにするためです.
CollapsingToolbarLayoutというネストされたスクロールメカニズムが効果を達成するために必要なコントロールは、ListViewが無効であるため、RecyclerView(RecycleviewがNestedScrollingChildインタフェースを実現した)が優先されます.同様に、ScrollViewもネストされたスクロールメカニズムをサポートしていませんが、NestedScrollViewを使用することができます.
 
(10)多重化機構
ListViewキャッシュメカニズム
RecycleBinメカニズム、RecycleBinはAbsListViewに定義されています.このうちView[]mActiveViewsを使用してViewを格納するのは、画面で使用されているViewであり、mActiveViewsに格納されているViewは一度しか取得できない.ArrayList[]mScrapViewsとArrayList mCurrentScrapは、画面を移動して廃棄されたViewを格納するためのものです.getViewメソッドがアダプタで呼び出されると、受信したconvertViewが空でなければ、廃棄されたViewから取得されます.
RecyclerViewキャッシュメカニズム
ScrapとCacheはそれぞれpositionを通じてView Holderを探して直接多重化することができる.
RecyclerViewでも毎回ViewHolderオブジェクトを再作成するのではなく、その都度ViewHolderデータを再バインドするのではなく、Recyclerで次のViewHolderを取得します.
RecyclerViewは、Recycler管理キャッシュViewHolderを使用し、異なる状態のViewHolderに対して異なる集合に格納されている.RecyclerViewには、ArrayList mAttachedScrap、ArrayList mCachedViews、ViewCacheExtension mViewCacheExtension、RecycledViewPool mRecyclerPoolの4つのキャッシュがあり、キャッシュの対象はViewHolderである.
一方、RecycledView Poolから多重化されたView Holderはデータを再バインドする必要があり、多重化されたView HolderはView Typeと同じテーブル項目にしか再利用できない.RecycledView PoolはView Typeによって分類されて格納されているため、RecycledView Poolはtypeを通じてView Holderを取得し、取得したView Holderは新しいものであり、データを再バインドする必要がある.ViewCacheExtensionカスタムキャッシュは、現在ではアプリケーションシーンが少ないが、慎重に使用する必要があります.mCachedViewsから多重化されたViewHolderは、指定された場所のitemにのみ再利用できます.mAttachedScrapから多重化されたViewHolderは、データを再作成したり再バインドしたりする必要はありません.
4つのレベルのキャッシュがヒットしていない場合、ViewHolderオブジェクトが再作成され、バインドされます.
 
 
 
3.RecycleViewとListViewのキャッシュ原理の詳細
第2章では,両者のキャッシュメカニズムを大まかに紹介した.
詳細なソース分析は参照できます:明日補充して、しばらく前に見たリンクが見つかりません.人のフローチャートが気に入った.(本当に細かい肝源コードがあまりない)
 
4.RecycleViewの最適化方法
以下を参照してください.https://juejin.cn/post/6844903661726859271#heading-4
 
 
すべての違いや原理をきちんと理解して把握したいのですが、そう簡単なことではないのではないでしょうか.
知れば知るほど、知らないほど多くなる.
 
参考記事:
 
https://www.cnblogs.com/chen-ying/p/12386712.html
https://www.jianshu.com/p/3e9aa4bdaefd
https://juejin.cn/post/6844903661726859271#heading-4