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


232

Androidドキュメントによると:

RecyclerViewウィジェットは、ListViewのより高度で柔軟なバージョンです。このウィジェットは、限られた数のビューを維持することによって非常に効率的にスクロールできる大きなデータセットを表示するためのコンテナーです。ユーザーのアクションやネットワークイベントに基づいて実行時に要素が変化するデータコレクションがある場合は、RecyclerViewウィジェットを使用します。

ListView効率が問題にならない場合は、実際に上記のすべてを行うことができます。また、を使用RecyclerViewして置き換えるときに多くの問題が見つかりましたListView

  1. リストアイテムを選択するためのonItemClickListener()はありません- 解決策

  2. リストアイテム間に区切りがない- 解決策

  3. 組み込みのオーバーラップセレクターがなく、リストアイテムをクリックしたときに視覚的なフィードバックがない- ソリューション

  4. リストヘッダーにaddHeaderViewがない- ソリューション

多分もっと問題...

したがって、を使用RecyclerViewして置換ListViewする場合、と同じ効果を得るには、多くの追加のコーディングを行う必要がありますListView

質問:

  • それは我々が交換することの価値があるListViewRecyclerViewは全く?
  • そうでない場合は、どちらの場合にRecyclerView代わりListViewに使用した方がよいでしょうか?

9
あなたのスレッドは最初の問題であり、私の質問ではありません
Xcihnegn

3
折りたたまれたアクションバーの使用に関心がある場合は、recyclerviewを使用する必要があることを伝えてください。medium.com/android-bites/...は
francas

リストビューよりも細かく制御できるため、recyclerviewを使用する必要があります。それは少し複雑ですが、そこに着くと、リストのようなものを扱っているときはいつでもあなたの人生はとても簡単になります。
Sadashiv

3
より良いものは良いものの敵です。
oldergod '20

回答:


118

ListViewが機能する場合、移行する理由はありません。新しいUIを作成している場合は、RecyclerViewの方がよいでしょう。

RecyclerViewは、リストをカスタマイズする必要がある場合、またはより良いアニメーションが必要な場合に強力です。ListViewのこれらの便利なメソッドは人々に多くの問題を引き起こしました。そのため、RecyclerViewはより柔軟なソリューションを提供します。

移行のために行う必要がある主な変更は、アダプターにあります。通話を続けたい場合notifyDataSetChangedは、アニメーションとバインドのメリットのほとんどが失われます。しかし、詳細な通知イベント(追加/削除/移動/更新)をディスパッチするようにアダプターを変更できる場合は、アニメーションとパフォーマンスが大幅に向上します。これらのイベントにより、RecyclerViewは正しいアニメーションを選択でき、不要なonBind呼び出しを回避することもできます。アイテムビューが複雑な場合、大きなメリットが得られます。また、今後はRecyclerViewの周囲にさらに多くのコンポーネントが追加される予定です。


2
私があなたに100票を与えることができれば、そうします。このnotifyDataSetChanged()方法では、常にRecyclerView新しいものを求め続けていてViewHoldersViewHolderパターンの利点を失っていました。解決策を探して私はあなたのコメントを見つけましたが、私の問題のほとんどを通過しています:Dありがとう!
Aspiring Dev 2016

「アイテムビューが複雑な場合、大きなメリットが得られる」とは同意しません。recyclerViewを使用していますが、アダプターが3の場合は、Recyclerviewのパフォーマンスが低下します。私は使用してリサイクルを無効にする必要がisRecyclable(false);あり、最終結果は非常に遅延したRecyclerViewです。これを変更することもできません。リストビューに戻るにはかなり時間がかかります:(
kashyap jimuliya

4
人々はより多くのタイプのRVを使用し、問題がなく、パフォーマンスが優れています。コードに他に何か問題があります。systrace / traceviewを使用して、状況を確認する必要があります。
yigit

1
@kashyapjimuliyaはyigitが述べたように、3 if-elseが原因ではないはずです。まず、これらのif-elseをどこに置くかについては触れませんでした。次に、リサイクルを無効にすると、速度が遅くなるはずです。どうして?ビューを膨らませfindViewById()て実行することは、そのViewHolderように実行するよりもはるかにコストがかかるためです。
Sufian

24

私によると、ListViewがアプリの現在のニーズをすべて満たし、すべてのユースケースを満たしている場合は、RecyclerViewに置き換える必要はありません。

RecyclerViewは、開発者の複雑さを増す代わりに、開発者に大きな力を与えます。ListViewで簡単に実行できる特定のことは、今では多くの不必要な努力をとることができます。

しかし、はい、レイアウトを水平、垂直、グリッド、または交互配置グリッドにシームレスに動的に変更できる驚くべきLayoutManager機能のように、ListViewが決して実行できないことがたくさんあります。

このトピックに関する詳細な回答をここに書きました。


3
確かに、RecyclerViewは複雑さを増しますが、少なくともViewHolderパターンを適切に実装します。
IgorGanapolsky 2016

ViewHolderパターン実装の@IgorGanapolsky +1。
Sreekanth Karumanaghat 2017

ListViewを使用すると、独自のビューホルダーパターンを問題なく作成できます
dan

9

1インターフェイスを使用してクリックリスナーを提供できます。この手法はListViewsでも使用しています。
2仕切りなし:幅がmatch_parent、高さが1 dpのビューを行に追加し、背景色を指定します。
3行の背景にStateListセレクターを使用するだけです。
4 addHeaderViewもListViewsで回避できます。ヘッダーをビューの外側に置くだけです。

したがって、効率性が問題になる場合は、はい、ListViewをRecyclerViewに置き換えることをお勧めします。


19
これらは私の質問ではありません。各問題の解決策へのリンクがありました
Xcihnegn

6

私は最近まで、非常に単純なリストにListViewを使用していました。たとえば、テキストオプションの簡単なリストを表示したい場合...

私はその決定を「ヒューマンファクター」に基づいており、パフォーマンスが重要でない場合は、少ないコードでシンプルなListViewを作成する方が良いと考えています。「パスカルの発明者である偉大なニクラウス・ヴィルス先生は、プログラムに50行を超えるコードが含まれていると間違いなく間違いない...」と言っていた大学の教授をよく思います。

しかし、ListViewの使用をやめたのは、最近、RelativeLayoutとともにAndroid Studioデザインツールの「レガシー」カテゴリに移動したことです。

https://developer.android.com/reference/android/widget/ListView

これは「非難」の「ソフト」な形だと思います。それが実際に非推奨であり、良心的な開発者全員がコードをRecyclerViewに移動した場合、それはあまりにも破壊的です。

さらに、ListViewの紹介では、RecyclerViewの方が優れたオプションであることを警告しています。
https://developer.android.com/reference/android/widget/ListView

また、ListViewのガイドでは引き続きカーソルローダーについて説明していますが、getSupportCursorLoader()自体はAPI 28で廃止されました
。https://developer.android.com/guide/topics/ui/layout/listview

Android Studioの最近の機能強化:

ファイル->新規->フラグメント->フラグメント(リスト)

これにより、基本的なテキストが入力された完全に機能するRecylerViewが得られます。これで、基本的なRecylerViewを設定するのと同じくらい簡単になり、ListViewを使用する最後の本当の理由がなくなりました。

要約すると、リストビューに「レガシー」のラベルを付けることは、廃止予定から一歩離れているため、ListViewを新しい開発に使用するつもりはありません。


3

ListViewを使用しても問題ないのは、リストが動的でないか、ネットワークイベントの影響を受けていない場合のみです。例:ナビゲーション。

その他の用途では、RecyclerViewはListViewを使用しません。RecyclerViewはリサイクルのみを対象としているため、位置の変更、再配置、アニメーション(実際にはRecyclerView.ItemAnimatorに付属)、カスタムレイアウト(ストックにはStaggeredGridに加えて古いリストまたはグリッドスタイルですが、このライブラリもあります、さらに拡張するもあります)。

また、あなたがCardViewを使用したい場合、私はそれが行くための唯一の方法(一部だと信じて読んで良いカードまたはリストを使用した場合)。


サーバーからデータのリストを取得することを言及していて、電話のsqliteに保存され、リスト表示(フォロワーのことを言う)で使用されます。ビューホルダー付きのリストビューよりもリサイクラービューを使用する方が適切です。 ?
Lion789

はい。しかし、正確には、ナビゲーション以外にListViewの役割はもうありません。それは、そこでRecyclerViewを使用するのはやり過ぎだと思うからです。
インミース2016年

2

優れた代替手段は、BaseAdapterを使用することです。Viewholderパターンの使用をサポートしており、ビットマップとボタンを含む100以上の行があり、非常にスムーズに実行されます。

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