RecyclerViewとListView


295

Android開発者から(リストとカードの作成):

RecyclerViewウィジェットは、ListViewのより高度で柔軟なバージョンです。

いいですね。でも、この例の画像を見て、これら2つの違いを本当に混乱しました。

ここに画像の説明を入力してください

上の画像はListView、カスタムアダプターを使用して簡単に作成できます。

それでは、どのような状況で使用する必要がありますRecyclerViewか?



1
@ Dev786:ここにコメントを追加して、この質問に関する多くの既存の回答から何が欠けていると感じているかを詳しく説明することをお勧めします。
CommonsWare 2017年

回答:


374

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

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

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

例:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. 一般的なリストアクションのアニメーション-アニメーションは分離され、に委任されItemAnimatorます。

についてはもっとありRecyclerViewますが、これらの点が主なものだと思います。

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


16
リストビューの主な責任は、1。)指定された領域内でアイテムを視覚的に配置し、できれば2.)アイテムを再利用することです。RecylerViewを使用すると、これは単一の責任に分かれます-リサイクルビューはリサイクルされ、LayoutManagerが画面上に項目を配置します。言い換えると、リサイクルビューは、アイテムを画面上のどこに配置するかを認識しておらず、それをリサイクルするだけです。android docから:「LayoutManagerを変更することにより、RecyclerViewを使用して、標準の垂直スクロールリスト、均一グリッド、交互グリッド、水平スクロールコレクションなどを実装できます。」
daneejela

32
"上/下にスクロールしながらセルを再利用する":これはビューホルダーのないリストビューでも発生するため、これは完全に間違っていることがわかっています。
Ruban

16
listviewでのビューホルダーの主な用途は、ListViewのスクロール中にコードが頻繁にfindViewById()を呼び出す場合があり、パフォーマンスが低下する可能性があります。アダプターがリサイクルのためにインフレートされたビューを返す場合でも、要素を調べて更新する必要があります。findViewById()を繰り返し使用する方法の1つは、「ビューホルダー」デザインパターンを使用することです。ViewHolderオブジェクトは、レイアウトのタグフィールド内に各コンポーネントビューを格納するので、繰り返し検索する必要なく、すぐにアクセスできます。
Ruban

7
ビューホルダーなしでリストビューを実装した場合でも、Rowはリサイクルされます。それがリストビューの特性と利点です。それは彼らがリストビューを作成したものです。
Ruban 2016年

彼らは特別なことは何もしませんでした。これらの機能は誰でも追加できます。ListViewとbaseAdapterを拡張し、必要に応じて機能を追加できます。実際には、これら2つの間に違いはありません。
MDP

39

リストビューのパフォーマンスを向上させるには、ホルダーパターンを実装する必要があります。特に、リストに複数の種類のビューを設定する場合は、簡単に失敗します。

RecyclerViewはこのパターンを焼き込み、失敗するのをより困難にします。また、より柔軟で、グリッドのように直線ではないさまざまなレイアウトを簡単に処理できます。


6
はい !、recyclerviewを使用しない場合については、さらに議論が必要です。行にモデルのデータに基づいて動的に追加されたコンテンツがあり、リサイクラービューBOOMを使用する場合。
ラナディープ

1
モデルデータに基づいて動的コンテンツを追加できるはずです。サポートするコンテンツの種類ごとに異なるビューを設定する必要があります。
CaptRespect 2015

36

ListViewはの祖先RecyclerViewです。ListViewうまくいかなかったり、うまくいかなかったりすることがたくさんありました。の欠点を収集しListView、問題をさまざまなドメインに抽象化することで問題を解決した場合、最終的にはリサイクラービューのようなものになります。リストビューの主な問題点は次のとおりです。

  • View同じ項目タイプの再利用を強制しませんでした(で使用されているアダプターの1つをListView見てください。getViewメソッドを調べると、1つが渡されても、プログラマーがすべての行に新しいビューを作成することを妨げるものがないことがわかります。convertView変数を介して)

  • コストのかかるfindViewById使用を防止しませんでした(上記のようにビューをリサイクルしている場合でも、開発者が呼び出しfindViewByIdて子ビューの表示されたコンテンツを更新することが可能でした。ViewHolderパターンの主な目的はListViewsfindViewById呼び出しをキャッシュすることでした。ただし、これはプラットフォームの一部ではなかったため、それについて知っていれば利用可能です)

  • 行が表示されたビューでサポートされる垂直スクロールのみ(リサイクラービューは、ビューの配置場所や移動方法は関係ありません。ビューはに抽象化されますLayoutManager。したがって、リサイクラーは、ListView上記のような従来型だけGridViewでなく、これに限定されるわけではありませんが、もっと多くのことができますが、それを実現するにはプログラミングのフットワークを行う必要があります)。

  • 追加/削除されるアニメーションは、考慮された使用例ではありませんでした。これをどのように行うかを理解するのは完全にあなた次第です(RecyclerViewを参照してください。アダプタークラスのnotify *メソッドとvViewListを比較して、アイデアを取得してください)。

要するにRecyclerView、より柔軟な方法ですが、ListViewユーザー側でより多くのコーディングが必要になる場合があります。


20

RecyclerView同様に任意のアダプタベースのビューをレンダリングするために準備された新しいのViewGroupです。の後継でListView and GridViewあると考えられており、にあり latest support-v7 versionます。RecyclerViewで開発された拡張性ではなく、少し痛み・イン・ザ・尻線量のない、ので、あなたが考えることができるレイアウトのいずれかの種類を作成することができ、心インチ

Antonio leivaからの回答

 compile 'com.android.support:recyclerview-v7:27.0.0'

RecyclerView確かにpowerful viewよりListViewです。詳細については、このページをご覧ください


5
私はあなたの答えからこの文章が好きです:これはAndroidなので、物事は決して簡単ではありませんこれはAndroidアプリの開発状況に当てはまりますが、APIの設計方法とビルドするパターンに問題があると思いますAndroidアプリ。理論的には、優れたデザインはプログラマーから考えられるすべての複雑さを隠す必要があります(ただし、高度なものにもアクセス可能です)。UIに関連する問題(および現在存在するより面倒な問題)の処理以外のビジネスロジック、データ、およびその他のアルゴリズムが一般的に気になります。 Android開発では)。
希望のない2016

18

以下は、RecyclerViewとListViewのいくつかの重要なポイント/違いです。賢くあなたの電話を取ってください。

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

RecylerViewにはViewHolderが組み込まれており、listViewのように独自に実装する必要はありません。特定のインデックスでの通知もサポートします

アイテムの追加または削除のアニメーションなどは、何もすることなくRecyclerViewにすでに実装されています

レイアウトマネージャーをRecyclerViewに関連付けることができます。これは、ListViewでの制限でしたが、RecycleViewでランダムなビューを取得するために使用できます。水平方向のListViewを実装する公式な方法はありません。RecyclerViewを使用して、

i)LinearLayoutManager-垂直リストと水平リストの両方をサポートします。ii)StaggeredLayoutManager-スタッガードリストのようなPinterestをサポートします。iii)GridLayoutManager-ギャラリーアプリに表示されるグリッドの表示をサポートします。

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


14

主な利点:

ViewHolderでは、デフォルトでは使用できませんListView。内に明示的に作成しgetView()ます。 RecyclerView作り付けていViewholderます。


4

上記の違いに加えて、次のような違いがあります。

  1. RVは、ビューの作成とビューへのデータのバインドを分離します。LVでは、ビューを作成するためにデータをバインドする前に、convertViewがnullかどうかを確認する必要があります。したがって、RVの場合、ビューは必要な場合にのみ作成されますが、LVの場合、convertviewのチェックに失敗し、毎回ビューを作成します。

  2. LayoutManagerを使用すると、グリッドとリストの切り替えがさらに簡単になりました。

  3. 1つのアイテムのみが変更された場合でも、すべてのアイテムに通知して更新する必要はありません。

  4. LVの場合、ビューキャッシングを実装する必要がありました。これはデフォルトでRVで提供されます。(ビューキャッシングとリサイクルには違いがあります。)

  5. RVの場合の非常に簡単なアイテムアニメーション。


4

リストビューに対するRecyclerViewの利点:

  1. デフォルトでViewHolderを含みます。

  2. 簡単なアニメーション。

  3. 水平、グリッド、千鳥配置のレイアウトをサポート

recyclerViewに対するlistViewの利点:

  1. 仕切りの追加も簡単。

  2. 単純なプレーンリストに組み込みのarrayAdapterを使用できます

  3. ヘッダーとフッターをサポートします。

  4. OnItemClickListnerをサポートします。


4
私の知る限り、あなたが簡単に使用してrecyclerViewに仕切りを追加することができます理解してrecyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));何かをやった後recyclerView = view.findViewById(R.id.feed);
nviens

1
@nviensリストビューの場合、ディバイダーを追加し、その高さを調整し、その色をすべてxml自体で変更できます。また、現在のディバイダーの実装は問題ありません。以前にrecyclerviewにディバイダーを追加するのは悪夢でした。この回答を確認して、ディバイダーの以前の実装がstackoverflow.com/a/27037230/6478047
Manohar Reddy

4

8 RecyclerViewとListViewの違い

RecyclerviewとListView

1. ViewHolderパターン

findViewById()メソッドの呼び出しを減らすために使用されるパターン。

ListViewでは、ViewHolderを使用せずにリストを簡単に作成できます。しかし、RecyclerViewの場合はそうではありません。

2.アダプター

はい、どちらもAdapterViewsです。アダプタークラスに基づいて動作します。

ArrayAdapter、CursorAdapterなどのデフォルトアダプターを使用してListViewを構築するのは簡単ですが、RecyclerViewはRecyclerView.Adapterクラスを提供し、新しいカスタムアダプタークラスを作成します。

RecyclerViewでArrayAdapterまたはその他の組み込みアダプターを使用することはできません。

3.アイテムの配置

シンプルで少ないコードで垂直リストビューを作成しました。しかし、GridViewを作成する必要がある場合はどうでしょうか。

RecyclerViewは、LayoutManagerを使用してアイテムを配置します。3つのLayoutManagerクラスがあります。

  • LinearLayoutManager-線形型リストの作成に役立ちます。
  • GridLayoutManager-グリッドの作成に使用されます。
  • StaggeredGridLayoutManager-千鳥格子を作成するために使用されます。

アニメーション

ListViewには基本的なアニメーションがありません。ただし、RecyclerViewには単純なアニメーションが付属しています。

分周器

アンドロイド:ディバイダアンドロイド:dividerHeight属性またはsetDivider()、setDividerHeight()あなたは、リストビューでカスタム分周器を作るのに役立ちます。

25.1.0以降、DividerItemDecorationクラスを使用して単純な仕切りを作成できます。

クリックイベント

RecyclerViewにはOnItemClickListenerがありませ。これはとても悲しいことです。しかし、RecyclerView.OnItemTouchListenerを提供することにより、開発者により多くの制御を提供します。

通知方法

正しいアニメーションを実行するには、適切なnotify *メソッドを呼び出す必要があります。RecylcerViewには、ListViewと比較したときに多くのnotify *メソッドがあります。


3

彼らが持っている主な最大の違いは、ListViewそれを作成または配置するときにアイテムの位置をRecyclerView探すことですが、一方でアイテムのタイプを探すことです。同じタイプで作成された別のアイテムがある場合、それは再度作成されRecyclerViewません。最初にアダプターを要求し、次にリサイクルプールを要求します。リサイクルプールが「ええ、それに似たタイプを作成しました」と言った場合、RecyclerView同じタイプを作成しようとしません。ListViewこの種のプーリングメカニズムはありません。


2

私の意見でRecyclerViewは、リストビューで使用されるリサイクルパターンの問題に対処するために作成されました。これは、開発者の生活をより困難にしていたためです。他のすべては多かれ少なかれ扱うことができます。たとえば、私はのために同じアダプタを使用ListViewし、GridViewそれが両方のビューには関係ありませんgetViewgetItemCountgetTypeCountそれは同じですので、使用されています。 RecyclerView場合に必要とされていないListViewListAdapterか、GridViewすでにあなたのために働いているグリッドアダプタを備えました。ViewHolderリストビューにパターンを正しく実装していれば、に対する大きな改善は見られませんRecycleView


2

私は少し働いてRecyclerView、それでも好きListViewです。

  1. もちろん、どちらもを使用ViewHoldersしているため、これは利点ではありません。

  2. A RecyclerViewはコーディングがより困難です。

  3. AにRecyclerViewはヘッダーとフッターが含まれていないため、マイナスです。

  4. A ListViewはViewHolderを作成する必要はありません。セクションまたはサブヘッダーを含むリストが必要な場合は、独立したアイテム(ViewHolderなし)を作成することをお勧めします。これは簡単で、個別のクラスを必要としません。


1
recyclerviewアダプターでヘッダーとコンテンツ側を作成でき、リストビューよりも柔軟性があります。ただ、ハードrecyclerviewにウルの心のリストビューを変更するが、これを行うことができれば、あなたは私がちょうどrecyclerviewグッドラック学ぼうと行く廃止予定mean.listviewかを理解します
erginduran

2
@erginduran、私は両方を使用しました。ListViewはまだ広く使用されており、非推奨ではありません。また、RecyclerViewよりもメモリの浪費が少ないです。ListViewをRecyclerViewに置き換えるだけの場合は、良い方法ではありません。
CoolMind 2016

この連中がrecyclerviewを開発した理由を確認してください。リストビューの改善ですよね?グーグルプレイには古いライブラリとアプリがたくさんあるので、リストビューはまだ広く使用されています。古いものは過去のままにしてください。比較をチェック-> リンク
erginduran

@erginduran、ありがとう。そうです、RecyclerViewにはいくつかの利点があります。私の答えは、ListViewがRecyclerViewよりも簡単な場合がある通常のタスクについてでした。もちろん、アニメーションやその他のいくつかの改善は、ListViewでは困難または不可能です。
CoolMind 2016

そのトピックにいくつかの側面を追加しました。stackoverflow.com/ a / 39721769/2914140を参照してください。
CoolMind 2016

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

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


0

簡単な答え:多くのアイテムを表示したい状況でRecyclerViewを使用する必要があり、アイテムの数は動的です。ListViewは、項目の数が常に同じで、画面サイズに制限されている場合にのみ使用してください。

Androidライブラリを念頭に置いて考えているだけなので、さらに難しくなります。

今日、独自のアダプターを構築するのに役立つ多くのオプションが存在し、選択、並べ替え、アニメーション、ディバイダーの使用、フッター、ヘッダーなどの追加などが可能な動的アイテムのリストとグリッドを簡単に構築できます。

怖がらないでRecyclerViewを試してみてください。ListViewとRecyclerViewでWebからダウンロードされた100個のアイテム(Facebookのニュースなど)のリストを作成すると、UX(ユーザーの違いがわかります。経験)スクロールしようとすると、おそらくそれを行う前にテストアプリが停止します。

簡単なアダプターを作成するには、この2つのライブラリーを確認することをお勧めします。

FastAdapter by mikepenz

davideasによるFlexibleAdapter


1
2つのパフォーマンスの違いについての説明は誇張されていると思います。私は2012年から運用アプリでListViewを使用しており、各行に最大10の異なるビューを含む最大3000のアイテムを表示しており、古いAndroid 2.3デバイスでもパフォーマンスに問題はありません。
Magnus W

0

RecyclerView情報

はでRecyclerView導入されましたAndroid 5.0 (Lollipop)サポートライブラリに含まれています。したがって、Android APIレベル7と互換性があります。

と同様にListViewRecyclerView’s主なアイデアは、パフォーマンスに適した方法でリスト機能を提供することです。このビューの名前の「Recycler」の部分は偶然そこにはありません。RecyclerView実際には、現在働いているとアイテムをリサイクルすることができます。リサイクルプロセスは、ビューホルダーと呼ばれるパターンのおかげで行われます

RecyclerViewの長所と短所

長所:

  • アイテムを追加、更新、削除するための統合アニメーション
  • ViewHolderパターンを使用してビューのリサイクルを実施します
  • グリッドとリストの両方をサポート
  • 垂直および水平スクロールをサポート
  • DiffUtilと一緒に使用できます

短所:

  • 複雑さを追加
  • OnItemClickListenerなし

ListView情報

ListView非常にアンドロイドの初めから出回っていました。でも利用可能で、API Level 1と同じ目的がありRecyclerViewます。

ListViewの使い方は実際には非常に簡単です。この点では、後継者とは異なります。学習曲線は、RecyclerViewの曲線よりも滑らかです。したがって、把握しやすくなります。LayoutManager、ItemAnimator、DiffUtilなどを処理する必要はありません。

ListViewの長所と短所

長所:

  • 簡単な使い方
  • デフォルトのアダプター
  • 利用可能なOnItemClickListener
  • それはの基礎です ExpandableListView

短所:

  • ViewHolderパターンの使用を受け入れません

0

ListViewとRecyclerViewの間には多くの違いがありますが、特に次のことに注意する必要があります。

  • ViewHolderパターンはListViewでは完全にオプションですが、RecyclerViewに組み込まれています。
  • ListViewは垂直スクロールのみをサポートしますが、RecyclerViewは垂直スクロールリストに限定されません。
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.