私は最近、Android 5.0でリリースされたAndroid RecycleView
に出会いました。RecycleView
は、ViewHolderパターンが組み込まれたカプセル化された従来のListView
であり、ビューを毎回作成するのではなく再利用を促進します。
RecycleView
を使用する他の利点は何ですか?両方がパフォーマンスの点で同じ効果がある場合、なぜRecycleViewを使用するのを選ぶのでしょうか。
編集
私は、人々が同様の質問をしたが、その答えは決定的なものではないと記録しておくためにここに追加した。
ListViewの代わりにRecyclerViewを使うべきですか?
なぜRecyclerViewはonItemClickListener()を持っていないのですか?そして、RecyclerViewはListviewとどう違うのですか?
Android Lollipopの登場により、RecyclerViewが正式に登場しました。 RecyclerViewははるかにListViewに比べて強力で柔軟、そして大きな機能強化しています。私はあなたにそれについての詳細な洞察を与えるようにします。
1)ViewHolderパターン
ListViewでは、ViewHolderパターンを使用することをお勧めしましたが、それは強制ではありませんでした。 RecyclerViewの場合、これは RecyclerView.ViewHolder クラスを使用して必須です。これは、ListViewとRecyclerViewの大きな違いの1つです。
それはRecyclerViewで物事をもう少し複雑にしますが、ListViewで直面した多くの問題は効率的に解決されます。
2)LayoutManager
これはRecyclerViewにもたらされたもう一つの大規模な機能強化です。リストビューでは、利用可能な唯一のビュータイプは垂直リストビューです。水平リストビューを実装する公式な方法さえありません。
今RecyclerViewを使用して、我々は持つことができます
i) LinearLayoutManager - 垂直リストと水平リストの両方をサポートします。
ii) StaggeredLayoutManager - スタガードリストのようにPinterestをサポートします。
iii) GridLayoutManager - Galleryアプリケーションで見られるようにグリッドを表示することをサポートします。
そして最良のことは、必要に応じてこれらすべてを動的に実行できることです。
)アイテムアニメーター
ListViewは良いアニメーションをサポートしていませんが、RecyclerViewはまったく新しい次元をもたらします。 RecyclerView.ItemAnimator クラスを使用すると、ビューのアニメーション化が非常に簡単で直感的になります。
4)アイテムの装飾
ListViewの場合は、境界線や仕切り線を追加するなどの動的な装飾項目は簡単ではありません。しかし、RecyclerViewの場合、 RecyclerView.ItemDecorator クラスは開発者に大きな制御を与えますが、少し時間がかかり複雑になります。
5)OnItemTouchListener
AdapterView.OnItemClickListener インターフェースのおかげで、ListViewでのアイテムクリックのインターセプトは簡単でした。しかしRecyclerViewは RecyclerView.OnItemTouchListener によって開発者により多くの力とコントロールを与えますが、それは開発者にとって物事を少し複雑にします。
簡単に言うと、RecyclerViewはListViewよりもはるかにカスタマイズしやすく、開発者に多くの制御と力を与えます。
RecycleView
を使用するもう1つの利点はアニメーションです。2行のコードで実行できます。
RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
recyclerView.setItemAnimator(itemAnimator);
しかし、ウィジェットはまだ生のままです。例えば、headerやfooterを作成することはできません。
さて、ほんの少し掘り下げると私はこれらの宝石をBill Philipsから見つけました article on RecycleView
RecyclerViewはListViewよりも多くのことができますが、RecyclerViewクラス自体はListViewよりも責任が少なくなります。箱から出してすぐに、RecyclerViewはしません:
- 画面上のアイテムの位置
- ビューをアニメートする
- スクロール以外のタッチイベントを処理する
これらすべてはListViewに組み込まれていますが、RecyclerViewは代わりにこれらの作業を行うためにコラボレータクラスを使用します。
あなたが作成したViewHoldersも、より美味しいです。それらは
RecyclerView.ViewHolder
をサブクラス化します。そしてそれはRecyclerView
が使うたくさんのメソッドを持っています。ViewHolders
は、現在どの位置にバインドされているか、またどのアイテムIDがあるかを知っています(それらがある場合)。その過程で、ViewHolder
は騎士団になりました。これは、以前はリストビューのアイテムビュー全体を保持する仕事でしたが、ViewHolder
はその一部のみを保持していました。これで、ViewHolderは
ViewHolder.itemView
フィールドにそのすべてを保持します。これは、ViewHolderのコンストラクターで割り当てられています。
Bill Phillipの 記事(その他の記事)からの情報ですが、次の点を指摘することが重要だと思いました。
ListViewでは、クリックイベントの処理方法について多少の曖昧さがありました。個々のビューはそれらのイベントを処理するべきですか、それともOnViewClickListenerを通してListViewがそれらを処理するべきですか?ただし、RecyclerViewでは、ViewHolderはそのような種類の詳細を処理する行レベルのコントローラオブジェクトとして機能するための明確な位置にあります。
LayoutManagerがポジショニングビューを処理し、ItemAnimatorがそれらのアニメーションを処理することを以前に説明しました。 ViewHolderは最後のピースです。RecyclerViewが表示する特定のアイテムで発生したイベントを処理する責任があります。
私はGlideイメージローダーでListView
を使いました、メモリが増えました。それから私はListView
をRecyclerView
に置き換えました。コーディングが難しいだけでなく、ListView
よりもメモリ使用量が多くなります。少なくとも、私のプロジェクトでは。
別のアクティビティで、私はEditText's
を含む複雑なリストを使いました。それらのいくつかでは入力方法が異なるかもしれません、またTextWatcher
を適用することができます。 ViewHolder
を使用した場合、スクロール中にTextWatcher
をどのように置き換えることができますか?だから、私はListView
なしでViewHolder
を使った、そしてそれはうまくいく。
上/下にスクロールしながらセルを再利用 - これは、ListViewアダプタにView Holderを実装することで可能ですが、RecycleViewではアダプタのデフォルトの記述方法ですが、これはオプションです。
リストをそのコンテナから切り離す - したがって、LayoutManagerを設定して、実行時に異なるコンテナ(linearLayout、gridLayout)にリスト項目を簡単に配置できます。
例:
mRecyclerView = (RecyclerView) findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 3));
一般的なリストアクションをアニメーション化します。
アニメーションは分離され、ItemAnimator
に委任されます。
RecyclerViewについての詳細がありますが、私はこれらの点が主なものだと思います。
LayoutManager
i)LinearLayoutManager - 垂直リストと水平リストの両方をサポートします。
ii)StaggeredLayoutManager - スタガードリストのようにPinterestをサポートします。
iii)GridLayoutManager - Galleryアプリケーションに見られるようなグリッドの表示をサポートします。
そして最良のことは、必要に応じてこれらすべてを動的に実行できることです。
RecyclerViewはListViewの改良として作成されたので、はい、ListViewコントロールで添付リストを作成できますが、RecyclerViewを使用する方が簡単です。
上/下にスクロールしながらセルを再利用:これはView HolderをListViewアダプタに実装することで可能になりますが、RecycleViewではアダプタのデフォルトの書き込み方法であるため、これはオプションです。
リストをそのコンテナから切り離す:したがって、LayoutManagerを設定することで、実行時にリスト項目をさまざまなコンテナ(linearLayout、gridLayout)に簡単に配置できます。
mRecyclerView =(RecyclerView)findViewById(R.id.my_recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setLayoutManager(new GridLayoutManager(this、2));
そのため、結論として、RecyclerViewは、懸念の委任のパターンに従った「リストデータ」を処理するためのより柔軟なコントロールです。
1.ビューホルダー
ListViewでは、ビューホルダーを定義することは、ビューの参照を保持するための推奨されるアプローチです。しかし、それは強制ではありませんでした。そうしないことによって、ListViewは古いデータを示しました。ビューホルダを使用しないことによるもう1つの大きな欠点は、毎回IDでビューを探すという重い操作につながる可能性があります。これは遅れたListViewsをもたらしました。
この問題はRecylerView.ReviewHolderクラスを使用することによってRecylerViewで解決されます。これはRecyclerViewとListViewの大きな違いの1つです。 RecyclerViewを実装するとき、ViewHolderを位置にバインドするためにアダプターによって使用されるViewHolderオブジェクトを定義するためにこのクラスが使用されます。ここで注意すべきもう1つのポイントは、RecyclerView用のアダプタを実装している間は、ViewHolderを提供することが必須であるということです。これは実装を少し複雑にしますが、ListViewで直面する問題を解決します。
2.レイアウトマネージャ
リストビューについて話すとき、1つのタイプのリストビュー、すなわち垂直リストビューのみが利用可能である。水平スクロールでListViewを実装することはできません。私は水平スクロールを実装する方法があることを知っていますが、私はそれがそのように機能するようには設計されていなかったと信じます。
しかし、Android RecyclerViewとListViewを比較すると、水平コレクションもサポートされています。実際、それは複数の種類のリストをサポートしています。複数の種類のリストをサポートするには、RecyclerView.LayoutManagerクラスを使用します。これはListViewにはない新しいことです。 RecyclerViewは、3種類の定義済みレイアウトマネージャをサポートしています。
LinearLayoutManager - これはRecyclerViewの場合に最も一般的に使用されるレイアウトマネージャです。これにより、水平スクロールリストと垂直スクロールリストの両方を作成できます。 StaggeredGridLayoutManager - このレイアウトマネージャを使用して、スタガードリストを作成できます。 Pinterestの画面のように。 GridLayoutManager - このレイアウトマネージャは、他の写真ギャラリーのようにグリッドを表示するために使用できます。
。アイテムアニメーター
リスト内のアニメーションはまったく新しい次元であり、無限の可能性を秘めています。 ListViewには、それ自体でアイテムのアニメート、追加、削除ができる特別な規定はありません。その代わりに、Androidが進化したので、ViewPropertyAnimatorは、リストビューのアニメーションのためのこのビデオチュートリアルでGoogleのChet Haaseによって提案されました。
一方、AndroidのRecyclerViewとListViewを比較すると、アニメーションを処理するためのRecyclerView.ItemAnimatorクラスがあります。このクラスを通じて、カスタムアニメーションをアイテムの追加、削除、移動イベントに対して定義できます。カスタマイズが不要な場合に備えて、DefaultItemAnimatorも用意されています。
4.アダプター
ListViewアダプタは実装が簡単でした。彼らはすべての魔法が起こっていたメインメソッドgetViewを持っていました。ビューがポジションに結び付けられていた場所。また、以前はアダプタにオブザーバを直接設定できる興味深いメソッドregisterDataSetObserverがありました。この機能はRecyclerViewにもありますが、RecyclerView.AdapterDataObserverクラスがそれに使用されます。しかし、ListViewを支持する点は、それがアダプタの3つのデフォルト実装をサポートするということです。
ArrayAdapter CursorAdapter SimpleCursorAdapter RecyclerViewアダプタは、ListViewアダプタが持っていた機能をすべて備えていますが、DBカーソルとArrayListsのサポートは組み込まれています。今のところRecyclerView.Adapterでは、アダプタにデータを提供するためのカスタム実装を作成する必要があります。 BaseAdapterがListViewに対して行うのと同じように。 RecyclerViewアダプタの実装について詳しく知りたい場合は、Android RecyclerViewの例を参照してください。
5.データの変更を通知する
ListViewを使用しているときにデータセットを変更した場合は、基になるアダプタのnotifyDataSetChangedメソッドを呼び出してデータを更新する必要があります。または、notifyDataSetChangedメソッドを自動的に呼び出す場合は、setNotifyOnChangeメソッドをtrueに設定します。しかしどちらの場合も、結果はリストで非常に重いです。基本的にリストの表示を更新します。
しかし逆に、RecyclerViewアダプターでは、単一の項目またはある範囲の項目が変更された場合は、それに応じて変更を通知するメソッドがあります。それらはそれぞれnotifyItemChangedとnotifyItemRangeChangedであり、そしてもっと多くのようなものです:
notifyItemInsterted notifyItemMoved notifyItemRangeInsterted notifyItemRangeRemovedもちろん、リスト全体をリフレッシュするための元のメソッド、つまり、適応されたデータセット全体が変更されたことを通知するnotifyDataSetChangedもあります。
6。アイテムデコレーション
ListViewでカスタム仕切りを表示するには、ListView XMLにこれらのパラメータを簡単に追加できます。
XHTML Android:デバイダ= "@ Android:カラー/透明" Android:dividerHeight = "5dp" 1 2 Android:デバイダ= "@ Android:カラー/透明" Android:dividerHeight = "5dp" Android RecyclerViewに関する興味深い部分は、現在のところ、デフォルトでは項目間の区切りは表示されていません。意図的に、Googleの人たちはカスタマイズのためにこれを省いたにちがいない。しかしこれは開発者の努力を大いに増大させます。アイテム間に仕切りを追加したい場合は、RecyclerView.ItemDecorationクラスを使用してカスタム実装を行う必要があります。
または、公式サンプルからこのファイルを使用してハッキングを適用することもできます。DividerItemDecoration.Java
7. OnItemTouchListener
リストビューは、クリックを検出するための単純な実装、つまりAdapterView.OnItemClickListenerインタフェースの使用によって使用されていました。
しかし、その一方でRecyclerView.OnItemTouchListenerインターフェースは、Android RecyclerViewでタッチイベントを検出するために使用されます。実装が少し複雑になりますが、タッチイベントを傍受するための開発者に対する制御が強化されます。公式ドキュメントには、RecyclerViewに配信される前にタッチイベントを傍受するため、ジェスチャ操作に役立つことがあると記載されています。