Android RecyclerviewとViewholderを使用したListView


148

私は最近RecyclerView、Android 5.0でリリースされたAndroidに出会いました。これは、ViewHolderパターンが組み込まれたRecyclerView従来のカプセル化ListViewされたもので、毎回作成するのではなく、ビューの再利用を促進しているようです。

を使用する他の利点は何RecyclerViewですか?パフォーマンスの点で両方に同じ効果がある場合、なぜRecyclerView`を好むのでしょうか?

編集する

私は人々が同様の質問をし、答えは決定的なものではないことを発見しました。記録保持のためにここに追加しました。

RecyclerviewとListview

ListViewを置き換えるためにRecyclerViewを使用する必要がありますか?

RecyclerViewにonItemClickListener()がないのはなぜですか?そしてRecyclerViewはListviewとどのように違うのですか?


4
これRecyclerViewは、APIがはるかに優れているため、より高速で用途が広いためです。アイテムの追加または削除をアニメーション化するようなものRecyclerViewは、何もすることなくすでにに実装されています。それについては疑問の余地はありません。ListViewゴミ箱に放り込んでくださいRecyclerView。ショーを盗むための場所です。
Xaver Kapeller、2015

4
レイアウトマネージャーをRecyclerViewに関連付けることができるため、垂直スクロールリストに限定されません。これは非常に強力な追加機能です。
アラン

@Alan-「垂直スクロールリストに限定されない」とはどういう意味ですか?リサイクルビューはグリッドビューとリストビューの「プレースホルダー」としても機能できると言っていますか?
Mushtaq Jameel、2015

@XaverKapeller-コメントではなく、2つの違いを一覧表示して質問に回答できれば、同じことについて疑問に思うかもしれない将来の私や他の人に役立つでしょう。
Mushtaq Jameel

@アラン-あなたが意味したことについて少し詳細を提供して、コメントではなく質問に答えてもらえますか?時間を割いていただきありがとうございます
Mushtaq Jameel

回答:


289

Android Lollipopの登場により、RecyclerViewが正式に登場しました。RecyclerViewは、はるかに強力で柔軟性があり、ListViewを大幅に強化したものです。それについて詳しく説明します。

1)ViewHolderパターン

ListViewでは、ViewHolderパターンの使用が推奨されていましたが、これは強制ではありませんでした。RecyclerViewの場合、これはRecyclerView.ViewHolderクラスを使用して必須です。これは、ListViewとRecyclerViewの主な違いの1つです。

RecyclerViewでは少し複雑になりますが、ListViewで直面した多くの問題は効率的に解決されます。

2)LayoutManager

これは、RecyclerViewにもたらされたもう1つの大幅な機能強化です。ListViewで使用できるビューのタイプは、垂直方向のListViewだけです。水平方向のリストビューを実装する公式な方法はありません。

RecyclerViewを使用して、

i)LinearLayoutManager-垂直リストと水平リストの両方をサポートします。

ii)StaggeredLayoutManager-スタッガードリストのようなPinterestをサポートします。

iii)GridLayoutManager-ギャラリーアプリに表示されるグリッドの表示をサポートします。

そして、最良のことは、これらすべてを必要に応じて動的に実行できることです。

3)アイテムアニメーター

ListViewは優れたアニメーションをサポートしていませんが、RecyclerViewはまったく新しい次元をもたらします。RecyclerView.ItemAnimatorクラスを使用すると、ビューのアニメーションが非常に簡単で直感的になります。

4)アイテムの装飾

ListViewの場合、境界線や仕切りの追加などの項目を動的に装飾することは決して容易ではありませんでした。ただし、RecyclerViewの場合、RecyclerView.ItemDecoratorクラスは開発者に大きな制御を提供しますが、少し時間がかかり、複雑になります。

5)OnItemTouchListener

AdapterView.OnItemClickListenerインターフェイスのおかげで、ListViewでのアイテムクリックのインターセプトは簡単でした。ただし、RecyclerViewはRecyclerView.OnItemTouchListenerサポートされなくなりました。AndroidXを参照してください)により、開発者にはるかに強力な制御を提供しますが、開発者にとっては少し複雑になります。

簡単に言うと、RecyclerViewはListViewよりもはるかにカスタマイズ可能であり、開発者に多くの制御と能力を提供します。


34
いい答えだ。追加のいくつかの大きなプラス:RecyclerViewは、表示されているエントリの前後にビューを準備します。これは、バックグラウンドでビットマップをフェッチする場合に最適です。特にRecyclerView.setHasFixedSizeを使用すると、パフォーマンスが劇的に速くなります。古いListViewは、リスト内のエントリのサイズを事前計算またはキャッシュする方法がないという前提に基づいており、スクロールしてレイアウトを実行すると、非常に複雑になります。慣れるまで少し時間がかかりますが、一度慣れると二度と戻ることはありません。
Robin Davies

@RobinDavies優れた点。お知らせいただきありがとうございます。ただし、アイテムのサイズが異なる場合は意味がありません。
Aritra Roy、2015

@AritraRoy Recyclerviewはロリポップのみまたはapi 14+(android 4+)でもサポートしますか?....「ロリポップ後:ほとんどの場所で
Animesh Mangla

2
ねえ、アリトラ、ListViewと比較するとき、ListViewもViewHolderパターンを使用する場合、どちらがより効率的に機能しますか?fpsまたは他の同様の基準を使用する場合、RecylerViewの方が優れていますか?
thx〜– RxRead

@RxRead:Robinのコメントを参照してください。彼は、パフォーマンスの観点から、RecyclerViewとListViewをビューホルダーパターンで区別しています。
Parag Kadam

10

使用のもう1つのプラスRecycleViewはアニメーションです。2行のコードで実行できます。

RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
        recyclerView.setItemAnimator(itemAnimator);

ただし、ウィジェットは未加工のままです。たとえば、ヘッダーフッターを作成できません。


5
その意味では、ヘッダーとフッターを作成することはできません。これらは、アダプターの他のビュータイプです。リストビューはアダプターをラップHeaderViewListAdapterし、バックグラウンドでヘッダーサポートを追加します。RecyclerViewあなたがコントロール内の1つです。
Eugen Pechanec 2015

RecyclerViewはデフォルトでDefaultItemAnimatorを使用します。では、なぜこのコードを使用したのですか?
Athira Reddy

9

さて、少し掘り下げて、ビル・フィリップスの記事からこれらの宝石を見つけましたRecycleView

RecyclerViewはListViewよりも多くのことを実行できますが、RecyclerViewクラス自体はListViewよりも責任が少なくなります。そのままでは、RecyclerViewは次のことを行いません。

  • 画面上のアイテムの配置
  • ビューをアニメーション化する
  • スクロール以外のタッチイベントを処理する

これらはすべてListViewに組み込まれていますが、RecyclerViewは、代わりにコラボレータークラスを使用してこれらのジョブを実行します。

作成したViewHolderもより強力です。それらはサブクラス RecyclerView.ViewHolderであり、これには多くのメソッドがRecyclerView 使用されています。ViewHoldersそれらが現在バインドされている位置と、アイテムID(ある場合)がわかります。その過程で、ViewHolder 騎士にされてきました。以前は、アイテムビュー全体を保持するのはListViewの仕事ViewHolderでしたが、その一部のみを保持していました。

これで、ViewHolderはViewHolder.itemView フィールドのすべてを保持します。フィールドはViewHolderのコンストラクタで割り当てられます。


4

ビルフィリップの記事の詳細(ぜひ読んでください!)は、次の点を指摘することが重要だと思いました。

ListViewでは、クリックイベントの処理方法にあいまいさがありました。個々のビューがそれらのイベントを処理する必要があるか、それともListViewがOnItemClickListenerを介して処理する必要がありますか?ただし、RecyclerViewでは、ViewHolderは明確な位置にあり、これらの種類の詳細を処理する行レベルのコントローラーオブジェクトとして機能します。

前に、LayoutManagerがビューの配置を処理し、ItemAnimatorがビューのアニメーションを処理することを確認しました。ViewHolderは最後の部分です。RecyclerViewが表示する特定のアイテムで発生するすべてのイベントを処理します。


2

ListViewはGlide画像ローダーを使用し、メモリが増加しました。次に、をに置き換えListViewましたRecyclerView。コーディングが難しいだけでなく、ListView。少なくとも、私のプロジェクトでは。

別のアクティビティでは、で複雑なリストを使用しましたEditText's。それらのいくつかでは、入力方法が異なる場合があり、a TextWatcherも適用できます。を使用した場合ViewHolderTextWatcherスクロール中にをどのように置き換えることができますか?したがって、私はListViewなしでを使用しましたViewHolderが、それは機能します。


私はViewHolderなしでListViewを使用しましたが、機能します。ひどい考え... スクロール中にTextWatcherをどのように置き換えることができますか?置き換える必要はありません... TextWacherは再利用後にデータを別のコンテナーに入れなければなりません...そしてそれは本当に簡単に行うことができます
Selvin

@Selvin、ご意見ありがとうございます。現在、そのプロジェクトは編集できません。TextWatcher画面にいくつかのがありました。おそらくあなたは正しいですが、私はそれをチェックすることができません。
CoolMind 2017年

1

上下にスクロールしながらセルを再利用します -これは、listViewアダプターにビューホルダーを実装することで可能ですが、オプションでしたが、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-ギャラリーアプリでのグリッドの表示をサポートします。

そして、最良のことは、これらすべてを必要に応じて動的に実行できることです。


1

1.ホルダーを見る

ListViewでは、ビューの参照を維持するための推奨アプローチは、ビューホルダーを定義することでした。しかし、それは強制ではありませんでした。そうしないことで、ListViewは古いデータを表示します。ビューホルダーを使用しないもう1つの大きな欠点は、毎回IDでビューを検索するという重い操作につながる可能性があります。その結果、リストビューが遅延しました。

この問題は、RecyclerView.ViewHolderクラスを使用してRecylerViewで解決されます。これは、RecyclerViewとListViewの大きな違いの1つです。RecyclerViewを実装する場合、このクラスは、ViewHolderを位置にバインドするためにアダプターが使用するViewHolderオブジェクトを定義するために使用されます。ここで注目すべきもう1つの点は、RecyclerViewのアダプターを実装するときに、ViewHolderを提供することが必須であることです。これにより、実装は少し複雑になりますが、ListViewで直面する問題は解決されます。

2.レイアウトマネージャー

ListViewといえば、使用できるListViewのタイプは1つだけです(垂直方向のListView)。水平スクロールでListViewを実装することはできません。私は水平スクロールを実装する方法があることを知っていますが、それがそのように機能するように設計されていなかったと私は信じています。

しかし、Android RecyclerViewとListViewを比較すると、水平方向のコレクションもサポートされています。実際には、複数のタイプのリストをサポートしています。複数のタイプのリストをサポートするには、RecyclerView.LayoutManagerクラスを使用します。これは、ListViewにはない新しいものです。RecyclerViewは、3種類の定義済みレイアウトマネージャーをサポートしています。

LinearLayoutManager –これは、RecyclerViewの場合に最も一般的に使用されるレイアウトマネージャーです。これにより、水平スクロールリストと垂直スクロールリストの両方を作成できます。StaggeredGridLayoutManager –このレイアウトマネージャーを使用して、ずらしたリストを作成できます。Pinterest画面と同じように。GridLayoutManager –このレイアウトマネージャーは、他の画像ギャラリーのようにグリッドを表示するために使用できます。

3.アイテムアニメーター

リスト内のアニメーションはまったく新しい次元であり、無限の可能性があります。そのため、ListViewでは、アイテムのアニメーション化、追加、または削除を行うための特別な規定はありません。その代わり、後でAndroidが進化するにつれて、ListViewのアニメーションに関するこのビデオチュートリアルで、GoogleのChet HaaseによってViewPropertyAnimatorが提案されました。

一方、Android RecyclerViewとListViewを比較すると、アニメーションを処理するためのRecyclerView.ItemAnimatorクラスがあります。このクラスを使用して、アイテムの追加、削除、移動イベントのカスタムアニメーションを定義できます。また、カスタマイズが不要な場合に備えて、DefaultItemAnimatorも提供します。

4.アダプター

ListViewアダプターの実装は簡単でした。彼らはすべての魔法がかつて起こったメインメソッドgetViewを持っていました。ビューが位置にバインドされた場所。また、以前は興味深いメソッドregisterDataSetObserverがあり、アダプターでオブザーバーを設定できました。この機能はRecyclerViewにもありますが、RecyclerView.AdapterDataObserverクラスが使用されます。しかし、ListViewを支持する点は、アダプターの3つのデフォルト実装をサポートすることです。

ArrayAdapter CursorAdapter SimpleCursorAdapter RecyclerViewアダプタは、DBカーソルとArrayListsの組み込みサポートを除いて、ListViewアダプタが持っていたすべての機能を備えています。現在、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:divider = "@ android:color / transparent" android:dividerHeight = "5dp" 1 2 android:divider = "@ android:color / transparent" android:dividerHeight = "5dp" Android RecyclerViewの興味深い部分は、現在のところ、デフォルトではアイテム間の仕切りは表示されません。Googleの人たちは、これをカスタマイズのために意図的に省略しているに違いありません。しかし、これにより開発者の労力が大幅に増加します。アイテム間に仕切りを追加する場合は、RecyclerView.ItemDecorationクラスを使用してカスタム実装を行う必要がある場合があります。

または、公式サンプルのこのファイルを使用して、ハックを適用できます:DividerItemDecoration.java

7. OnItemTouchListener

リストビューは、クリックを検出するために、つまりAdapterView.OnItemClickListenerインターフェイスを使用することで、単純な実装を使用していました。

ただし、一方でRecyclerView.OnItemTouchListenerインターフェイスは、Android RecyclerViewでタッチイベントを検出するために使用されます。実装は多少複雑になりますが、開発者はタッチイベントをインターセプトするための制御を強化できます。公式ドキュメントによれば、RecyclerViewに配信される前にタッチイベントをインターセプトするため、ジェスチャー操作に役立つ場合があります。


1

RecyclerViewはListViewの改良点として作成されたので、はい、ListViewコントロールを使用して添付リストを作成できますが、RecyclerViewを使用する方が簡単です。

  1. 上下にスクロールしながらセルを再利用します。これは、ListViewアダプターにビューホルダーを実装することで可能ですが、これはオプションであり、RecycleViewではアダプターを作成するデフォルトの方法です。

  2. リストをそのコンテナから切り離します。LayoutManagerを設定して、実行時にリストアイテムをさまざまなコンテナ(linearLayout、gridLayout)に簡単に配置できます。

mRecyclerView =(RecyclerView)findViewById(R.id.my_recycler_view); mRecyclerView.setLayoutManager(new LinearLayoutManager(this)); mRecyclerView.setLayoutManager(new GridLayoutManager(this、2));

  1. 一般的なリストアクションをアニメーション化します。アニメーションは分離され、ItemAnimatorに委任されます。RecyclerViewについてはもっとありますが、これらの点が主なものだと思います。

したがって、結論として、RecyclerViewは、懸念の委任のパターンに従って「リストデータ」を処理するためのより柔軟なコントロールであり、1つのタスク(アイテムのリサイクル)だけに任せます。


0

RecycleViewを使用する場合は、最初にセットアップにさらに手間がかかります。単純なアイテムのonclick、border、touchイベントなどの単純なものをセットアップするために、より多くの時間を与える必要があります。しかし、最終製品は完璧です。

したがって、決定はあなた次第です。アイテムをクリックするだけで十分な、電話帳の読み込みなどのシンプルなアプリを設計する場合は、リストビューを実装できます。しかし、無制限にスクロールできるソーシャルメディアのホームページのようなデザインの場合。アイテム間のいくつかの異なる装飾、リサイクルビューを使用するよりも個々のアイテムの多くの制御。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.