web-dev-qa-db-ja.com

ListViewの代わりにRecyclerViewを使うべきですか?

Androidのドキュメントは言う:

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

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

  1. リスト項目選択のためのonItemClickListener()はありません -

  2. リスト項目間の区切りなし - 解決策

  3. 組み込みのオーバーラップセレクタはありません。リストアイテムをクリックしても視覚的なフィードバックはありません - ソリューション

  4. リストヘッダーにはaddHeaderView - 解決策

多分もっと問題...

そのため、RecyclerViewを置換するためにListViewを使用する場合、ListViewと同じ効果を得るには、さらに多くのコーディングを行う必要があります。

質問:

  • ListViewを完全にRecyclerViewに置き換えることは価値がありますか?
  • そうでない場合は、どの場合に、私たちはRecyclerViewの代わりにListViewを使用するべきです。
223
Xcihnegn

ListViewが機能する場合は、移行する必要はありません。もしあなたが新しいUIを書いているなら、RecyclerViewを使った方が良いかもしれません。

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

移行に必要な主な変更は、アダプタにあります。 notifyDataSetChangedを呼び出し続けたい場合は、アニメーションとバインディングの利点のほとんどを失うことになります。しかし、詳細な通知イベント(追加/削除/移動/更新)を送信するようにアダプタを変更することができれば、アニメーションとパフォーマンスが大幅に向上します。これらのイベントはRecyclerViewに正しいアニメーションを選択させ、それはまた不要なonBind呼び出しを避けるのに役立ちます。商品ビューが複雑な場合は、大きなメリットがあります。また、今後はRecyclerViewの周りにもっと多くのコンポーネントがあるでしょう。

117
yigit

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

RecyclerViewは、開発者の複雑さを増すことを犠牲にして開発者に大きな力を与えます。 ListViewで簡単に実行できることがいくつかありますが、これで多くの不要な作業を行うことができます。

ただし、ListViewでは、レイアウトを水平、垂直、グリッド、またはスタガードグリッドにシームレスに動的に変更できるLayoutManagerの機能のように、不可能なことがたくさんあります。

私はこのトピック について詳細な答えをここに書いた

23
Aritra Roy

1クリックリスナーを提供するためのインターフェースを使用できます。私はListViewsでもこのテクニックを使います。
2区切り文字なし:match_parentの幅のビューを単純に行に追加します。1dpの高さで、background colorとします。
3行の背景にStateListセレクタを使用するだけです。
4addHeaderViewは、ListViewでも避けることができます:単にHeaderoutsidetheを入力。

そのため、効率が重要な場合は、yesのように、ListViewをRecyclerViewに置き換えることをお勧めします。

8
Fantômas

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

私はその決定を「人的要因」に基づいていました。パフォーマンスが重要でない場合は、より少ないコードで簡単なListViewを作成することがより良いということです。 「私の先生、パスカルの発明者であるNiclaus Wirthの偉大なる先生が、プログラムに50行を超えるコードが含まれている場合、それは間違いであると確信していました。」

しかし、ListViewの使用をやめるべきだと私に確信させたのは、それが最近RelativeLayoutと共にAndroid Studio設計ツールの「Legacy」カテゴリに移動したことです。

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

これは「やわらかい」形の「非推奨」だと思います。それが実際に廃止され、良心的な開発者全員が自分のコードをRecyclerViewに移したならば、それはあまりにも破壊的でしょう。

さらに、ListViewの序文では、RecyclerViewがより良い選択肢であることを一番上に警告しています。「リストを表示するためのより近代的で柔軟性があり、高性能なアプローチには、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を使用するつもりはありません。ラベルを「レガシー」にすることは、それを廃止することからの一歩です。

5
Elletlar

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

その他の用途では、RecyclerViewはListViewを省略します。 RecyclerViewはリサイクルのみを目的としているため、位置や配置の変更、アニメーション(実際にはRecyclerView.ItemAnimatorに付属)、カスタムレイアウト(ストックにはStaggeredGridがあります)など、ListViewで密接に結びついた視覚的な関連事項を行うのが簡単です古いリストまたはグリッドスタイルですが、これをさらに拡張した ライブラリ もあります。

また、あなたがCardViewを使いたいのであれば、私はそれが唯一の道であると信じています(カードやリストを使うときは 良い読み方 )。

3
inmyth

素晴らしい代替案はBaseAdapterを使うことです。これはビューホルダパターンの使用をサポートし、私のものはビットマップとボタンを含む100以上の行を含み、とてもスムーズに動きます。

1
grantespo