RecyclerView와 ListView


295

안드로이드 개발자 ( 목록 및 카드 만들기 )에서 :

RecyclerView 위젯은 ListView의보다 유연하고 유연한 버전입니다.

좋아, 그것은 시원하게 들리지만,이 예제 사진을 보았을 때, 나는이 두 가지의 차이점에 대해 정말로 혼란스러워했습니다.

여기에 이미지 설명을 입력하십시오

위의 그림은 ListView사용자 정의 어댑터 를 사용하여 쉽게 만들 수 있습니다 .

어떤 상황에서 사용해야 RecyclerView합니까?



1
Dev786 @ : 나는 당신이 누락 된 느낌이 무엇인지 구체적으로 설명 여기에 댓글을 추가하는 것이 좋습니다 많은 이 질문에 기존의 답변.
CommonsWare

답변:


374

RecyclerViewListView개선 으로 작성 되었으므로 예, ListView제어 기능이 있는 첨부 목록을 만들 수는 있지만 사용하는 RecyclerView것이 더 쉽습니다.

  1. 위 / 아래로 스크롤하는 동안 셀을 재사용 합니다. ListView어댑터 에서 뷰 홀더를 구현하면 가능 하지만 선택 사항이지만 RecycleView어댑터를 작성하는 기본 방법입니다.

  2. 컨테이너에서 목록을 분리 하여 런타임에 목록 항목을 다른 컨테이너 (linearLayout, gridLayout)에 쉽게 설정하여 설정할 수 LayoutManager있습니다.

예:

mRecyclerView = (RecyclerView) findViewById(R.id.my_recycler_view);
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
//or
mRecyclerView.setLayoutManager(new GridLayoutManager(this, 2));
  1. 공통 목록 작업에 애니메이션을 적용합니다 ItemAnimator. 애니메이션이 분리되어에 위임됩니다 .

에 대한 자세한 내용 RecyclerView이 있지만 이러한 요점이 주요 사항이라고 생각합니다.

결론적으로, RecyclerView우려의 위임 패턴을 따르는 "목록 데이터"를 처리하기위한보다 융통성있는 제어는 재활용 품목이라는 하나의 작업만을 떠난다.


16
목록보기의 주요 책임은 1) 지정된 영역 내에서 항목을 시각적으로 정렬하고 2) 다시 사용하는 항목입니다. RecylerView를 사용하면 단일 책임으로 나뉩니다-재활용보기가 재활용되고 LayoutManager가 화면에 항목을 정렬합니다. 다시 말해, 재활용보기는 항목을 화면에 배치 할 위치를 알거나 관리하지 않고 단지 재활용을 처리합니다. 안드로이드 문서에서 : "LayoutManager를 변경함으로써 RecyclerView를 사용하여 표준 세로 스크롤 목록, 균일 한 그리드, 엇갈린 그리드, 가로 스크롤 모음 등을 구현할 수 있습니다."
daneejela

32
"위 / 아래로 스크롤하는 동안 셀 재사용": 지금까지는 이것이 잘못되었다는 것을 알고 있습니다. 이는 뷰 홀더가없는 목록보기에서도 발생하기 때문입니다.
Ruban

16
listview에서 view holder의 주된 용도는 코드에서 ListView를 스크롤하는 동안 findViewById ()를 자주 호출하여 성능이 저하 될 수 있다는 것입니다. 어댑터가 재활용을 위해 팽창 된보기를 리턴하더라도 여전히 요소를 찾아서 업데이트해야합니다. findViewById () 반복 사용 방법은 "뷰 홀더"디자인 패턴을 사용하는 것입니다. ViewHolder 객체는 각 구성 요소 뷰를 레이아웃의 태그 필드 안에 저장하므로 반복적으로 조회하지 않고도 즉시 액세스 할 수 있습니다.
Ruban

7
내가 말하려고하는 것은 뷰 홀더없이 listview를 구현하더라도 행이 재활용된다는 것입니다. 이것이 listview의 속성이자 장점입니다. 이것이 그들이 목록보기를 만든 것입니다.
Ruban

그들은 특별한 작업을 수행하지 않았습니다. 이러한 기능은 누구나 추가 할 수 있습니다. ListView 및 baseAdapter를 확장하고 원하는 경우 기능을 추가 할 수 있습니다. 실제로이 둘 사이에는 차이가 없습니다.
MDP

39

목록보기의 성능을 높이려면 홀더 패턴을 구현해야하며 목록을 여러 종류의보기로 채우려는 경우 특히 엉망입니다.

RecyclerView는이 패턴을 베이킹하여 혼란스럽게 만듭니다. 또한 그리드와 같이 직선적이지 않은 다른 레이아웃을보다 쉽게 ​​처리 할 수 ​​있도록 유연성이 뛰어납니다.


6
예 ! recyclerview를 사용 하지 않을 때에 대한 더 많은 토론이 있어야합니다 . 모델 데이터를 기반으로 행에 내용이 동적으로 추가되어 있고 Recycler보기 인 BOOM을 사용하는 경우.
라나 딥

1
모델 데이터를 기반으로 동적 컨텐츠를 추가 할 수 있어야합니다. 지원하려는 모든 유형의 컨텐츠에 대해 다른보기를 설정하기 만하면됩니다.
CaptRespect

36

ListView의 조상 RecyclerView입니다. ListView하지 않았거나 잘하지 못한 것들이 많이있었습니다 . 단점을 모으고 ListView문제를 다른 도메인으로 추상화하여 문제를 해결했다면 리사이클 러보기와 같은 결과가 나타납니다. ListViews의 주요 문제점은 다음과 같습니다.

  • View동일한 항목 유형에 재사용을 강요하지 않았습니다 (에서 사용되는 어댑터 중 하나를 살펴보십시오 ListView. getView 메소드를 연구하면 프로그래머가 전달 된 경우에도 프로그래머가 모든 행에 대해 새보기를 작성하는 것을 막을 수는 없습니다. convertView변수 를 통해 )

  • 비용이 많이 드는 findViewById사용을 막지 못함 (위에서 언급 한 것처럼 뷰를 재활용하는 경우에도 개발자가 findViewById하위 뷰의 표시된 내용을 업데이트 하도록 호출 할 수있었습니다. ViewHolder패턴 의 주요 목적은 호출 ListViews을 캐시하는 것이 었습니다 findViewById. 플랫폼의 일부가 아니기 때문에 알고 있다면 사용 가능)

  • 행으로 표시되는 뷰가있는 세로 스크롤 만 지원됨 (리사이클 러보기는 뷰의 위치와 이동 방법에 신경 쓰지 않고로 추상화됩니다 LayoutManager. 따라서 리사이클 러는 ListView위와 같이 전통적인 것뿐만 아니라 GridView, 그것에 국한되지 않고 더 많은 일을 할 수 있지만,이를 위해서는 프로그래밍 작업이 필요합니다.

  • 추가 / 제거 할 애니메이션은 고려 된 사용 사례가 아닙니다. 이 문제를 해결하는 방법을 알아내는 것은 전적으로 귀하의 몫입니다 (RecyclerView 비교. 어댑터 클래스 통지 * 메소드 오퍼링 v. 아이디어를 얻기위한 ListViews 비교).

요컨대 , 더 많은 코딩을 수행해야 할 수도 있지만 RecyclerView더 유연하게 사용할 ListView수 있습니다.


20

그만큼 RecyclerView 유사한 방법으로 모든 어댑터 기반 뷰를 렌더링 할 준비가되어 새로운 뷰 그룹이다. 의 후임자라고 가정 ListView and GridView하고에서 찾을 수 있습니다 latest support-v7 version. 는 RecyclerView개발 된 확장 하지만 약간의 통증 - 인 - 더 - 엉덩이를 투여하지 않고, 그래서 당신이 생각할 수있는 레이아웃의 모든 종류를 만들 수 있습니다 마음입니다.

Antonio leiva의 답변

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

RecyclerView실제로는 ~ powerful view보다ListView . 자세한 내용은 이 페이지를 방문 하십시오 .


5
나는 당신의 대답 에서이 문장을 좋아합니다 : 이것은 안드로이드이므로 일이 결코 쉽지 않습니다. 이것은 안드로이드 앱 개발이 진행되고있는 사실에 해당하지만 API를 어떻게 디자인했는지와 패턴을 만드는 방법에있어 잘못된 것이라고 생각합니다. 안드로이드 앱. 이론적으로 좋은 디자인은 프로그래머가 가능한 모든 복잡성을 숨겨야하지만 (고급 프로그래머에게는 여전히 접근 가능해야 함), UI 관련 문제를 처리하는 데 어려움을 겪는 것 이외의 비즈니스 논리, 데이터 및 기타 알고리즘 (현재 더 지루한 문제가 있음) 안드로이드 개발에서).
Hopeless

18

다음은 RecyclerView와 ListView의 주요 요점 / 차이점입니다. 현명하게 전화하십시오.

ListView가 효과가 있다면 마이그레이션 할 이유가 없습니다. 새 UI를 작성하는 경우 RecyclerView를 사용하는 것이 좋습니다.

RecylerView에는 ViewHolder가 내장되어 있으므로 listView와 같이 자체 구현 할 필요가 없습니다. 특정 인덱스에서도 통지 지원

항목 추가 또는 제거 애니메이션 등의 작업은 아무것도하지 않아도 RecyclerView에 이미 구현되어 있습니다.

레이아웃 관리자를 RecyclerView와 연결할 수 있습니다. 이것은 RecycleView에서 임의의 뷰를 얻는 데 사용할 수 있지만 이것이 ListView의 제한 사항이었습니다. ListView에서 사용 가능한 유일한 뷰 유형은 세로 ListView입니다. 수평 ListView를 구현하는 공식적인 방법은 없습니다. 이제 RecyclerView를 사용하여

i) 수직 및 수평 목록을 모두 지원하는 LinearLayoutManager, ii) 엇갈린 목록과 같이 Pinterest를 지원하는 StaggeredLayoutManager, iii) GridLayoutManager-갤러리 앱에서 볼 수있는 그리드 표시를 지원합니다.

가장 좋은 점은 원하는대로이 모든 것을 동적으로 수행 할 수 있다는 것입니다.


14

주요 장점 :

ViewHolder에서 기본적으로 사용할 수 없습니다 ListView. 내부에 명시 적으로 만들 것 getView()입니다. RecyclerView내장했다 Viewholder.


4

위의 차이점 외에도 다음과 같은 몇 가지 사항이 더 있습니다.

  1. RV는 뷰 생성과 뷰에 대한 데이터 바인딩을 분리합니다. LV에서, 데이터를 바인딩하기 전에 convertView가 널인지보기를 작성해야합니다. 따라서 RV의 경우보기는 필요할 때만 작성되지만 LV의 경우 변환보기 확인을 놓칠 수 있으며 매번보기를 작성합니다.

  2. LayoutManager를 사용하면 그리드와 목록 간 전환이 더욱 쉬워졌습니다.

  3. 단일 항목 만 변경하더라도 모든 항목을 통지하고 업데이트 할 필요가 없습니다.

  4. LV의 경우 뷰 캐싱을 구현해야했습니다. 기본적으로 RV로 제공됩니다. 뷰 캐싱과 재활용 간에는 차이가 있습니다.

  5. RV의 경우 매우 쉬운 아이템 애니메이션.


4

listview에 비해 RecyclerView의 장점 :

  1. 기본적으로 ViewHolder를 포함합니다.

  2. 쉬운 애니메이션.

  3. 수평, 격자 및 지그재그 형 레이아웃 지원

recyclerView에 비해 listView의 장점 :

  1. 분배기를 쉽게 추가 할 수 있습니다.

  2. 간단한 일반 목록을 위해 내장형 arrayAdapter를 사용할 수 있습니다.

  3. 머리글 및 바닥 글을 지원합니다.

  4. OnItemClickListner를 지원합니다.


4
내가 아는 recyclerView.addItemDecoration(new DividerItemDecoration(getContext(), LinearLayoutManager.VERTICAL));한 다음과 같은 작업을 수행 한 후 사용하여 recyclerView에 쉽게 디바이더를 추가 할 수 있습니다recyclerView = view.findViewById(R.id.feed);
nviens

1
@nviens 목록보기를 위해 구분선을 추가하고 높이를 조정하고 xml에서 자체 색상을 모두 변경할 수 있습니다. 또한 분할 현재 실현하는 것이, 이전에 recyclerview에 대한 디바이더를 추가하는 악몽 단지 확인, 그냥 분할에 대한 이전의 구현이 얼마나 볼이 답변을 확인 stackoverflow.com/a/27037230/6478047
Manohar 레디

4

RecyclerView와 ListView의 8 가지 차이점

Recyclerview와 ListView

1. ViewHolder 패턴

findViewById () 메소드 에 대한 호출을 줄이는 데 사용되는 패턴 입니다.

ListView에서는 ViewHolder를 사용하지 않고도 목록을 쉽게 작성할 수 있습니다. 그러나 RecyclerView의 경우는 아닙니다.

2. 어댑터

둘 다 AdapterView입니다. 어댑터 클래스를 기반으로 작동합니다.

ArrayAdapter, CursorAdapter와 같은 기본 어댑터를 사용하여 ListView를 쉽게 작성할 수 있지만 RecyclerView는 RecyclerView.Adapter 클래스를 제공하여 새 사용자 정의 어댑터 클래스를 작성합니다.

RecyclerView와 함께 ArrayAdapter 또는 기타 내장 어댑터를 사용할 수 없습니다.

3. 품목 배열

간단하고 적은 코드로 Vertical ListView를 만들었습니다. 그러나 GridView를 만들어야하는 경우 어떻게해야합니까?

RecyclerView는 LayoutManager를 사용하여 항목을 정렬합니다. 3 개의 LayoutManager 클래스가 있습니다.

  • LinearLayoutManager- 선형 유형 목록을 작성하는 데 도움이됩니다.
  • GridLayoutManager- 그리드를 만드는 데 사용됩니다.
  • StaggeredGridLayoutManager-스 태거 그리드 를 만드는 데 사용됩니다.

애니메이션

ListView에는 기본 애니메이션이 없습니다. 그러나 RecyclerView에는 간단한 애니메이션이 제공됩니다.

분할기

안드로이드 : 분할안드로이드 : dividerHeight 속성 또는 setDivider ()는 setDividerHeight는 ()는 ListView를 사용자 정의 분할 할 수 있습니다.

25.1.0 이후, 당신은 사용할 수 있습니다 DividerItemDecoration을 간단한 디바이더를 만들기 위해 클래스.

클릭 이벤트

RecyclerView에는 OnItemClickListener 가 없습니다 . 그렇습니다. 매우 슬프습니다. 그러나 RecyclerView.OnItemTouchListener 를 제공하여 개발자에게 더 많은 제어권을 부여 합니다.

알림 방법

올바른 애니메이션을 수행하려면 적절한 notify * 메소드를 호출해야합니다. RecylcerView에는 ListView와 비교할 때 notify * 메소드가 많이 있습니다.


3

그들이 가지고있는 가장 큰 차이점 ListView은 항목을 만들거나 넣을 때 항목의 위치 를 찾는 반면에 항목 RecyclerView의 유형을 찾는 것입니다. 동일한 유형으로 작성된 다른 항목이 RecyclerView있으면 다시 작성하지 않습니다. 첫 번째 어댑터를 요청한 다음 재활용 풀에 "그렇습니다. 비슷한 유형을 만들었습니다"라고 표시되면 RecyclerView동일한 유형을 만들지 않습니다. ListView이런 종류의 풀링 메커니즘이 없습니다.


2

제 생각에는 목록보기에 RecyclerView사용 된 재활용 패턴의 문제를 해결하기 위해 개발자의 삶을 어렵게 만들었습니다. 다른 모든 것들은 더 많거나 적을 수 있습니다. 예를 들어 나는에 대해 동일한 어댑터를 사용 ListView하고 GridView는 모두 조회 수에 상관 없습니다 getView, getItemCount, getTypeCount이 같은 그래서 사용된다. 그리드 어댑터를 사용 하거나 사용 RecyclerView하는 경우 이미 필요하지 않습니다 . 목록보기에서 패턴을 올바르게 구현하면에 비해 크게 개선되지 않습니다 .ListViewListAdapterGridViewViewHolderRecycleView


2

나는 조금 함께 일 RecyclerView했지만 여전히 선호합니다 ListView.

  1. 물론, 둘 다 사용 ViewHolders하므로 이점이 없습니다.

  2. A RecyclerView는 코딩이 더 어렵다.

  3. A RecyclerView에는 머리글과 바닥 글이 포함되어 있지 않으므로 빼기입니다.

  4. A ListView는 ViewHolder를 만들 필요가 없습니다. 섹션이나 하위 헤더가있는 목록을 원하는 경우 (ViewHolder없이) 독립적 인 항목을 만드는 것이 좋습니다. 별도의 클래스가 필요하지 않습니다.


1
recyclerview 어댑터에서 헤더와 내용을 만들 수 있으며 listview보다 유연합니다. 단지 하드 recyclerview에 UR 마음 목록보기를 변경할 수 있지만, 당신이 할 수 있다면, 당신은 난 그냥 recyclerview goodluck는 배우려고 가서되지 mean.listview 이해합니다
erginduran

2
@ erginduran, 나는 둘 다 사용했다. ListView는 여전히 널리 사용되며 더 이상 사용되지 않습니다. 또한 RecyclerView보다 적은 메모리를 사용합니다. ListView를 RecyclerView로만 바꾸려면 좋은 생각이 아닙니다.
CoolMind

왜이 사람들이 recyclerview를 개발했는지 확인하십시오. 목록보기 개선? 구글 플레이에는 오래된 라이브러리와 앱이 많이 있으므로 올바른 목록보기가 여전히 널리 사용됩니다. 과거에는 오래된 것을 남겨 두십시오. 비교 점검-> 링크
Erginduran

@erginduran, 감사합니다. 맞습니다. RecyclerView에는 몇 가지 장점이 있습니다. 내 대답은 때로는 RecyclerView보다 ListView가 더 쉬운 일반적인 작업에 관한 것입니다. 물론 ListView에서는 애니메이션 및 기타 개선 사항이 어렵거나 불가능합니다.
CoolMind

해당 주제에 몇 가지 측면을 추가했습니다 . stackoverflow.com/a/39721769/2914140을 참조하십시오 .
CoolMind

1
  1. 인터페이스를 사용하여 클릭 리스너를 제공 할 수 있습니다. 이 기술도 ListView와 함께 사용합니다.
  2. 분배기 없음 : 너비가 match_parent이고 높이가 1dp 인 뷰를 행에 추가하고 배경색을 지정하십시오.
  3. 행 배경에 StateList 선택기를 사용하면됩니다.
  4. addHeaderView는 ListViews에서도 피할 수 있습니다. 헤더를 뷰 외부에두기 만하면됩니다.

따라서 효율성이 문제라면 ListView를 RecyclerView로 바꾸는 것이 좋습니다.


0

간단한 대답 : 많은 항목을 표시하려는 경우 RecyclerView를 사용해야하며 그 수는 동적입니다. ListView는 항목 수가 항상 동일하고 화면 크기로 제한된 경우에만 사용해야합니다.

안드로이드 라이브러리를 염두에두고 생각하기 때문에 더 어려워집니다.

오늘날에는 자체 어댑터를 빌드하는 데 도움이되는 많은 옵션이 있으며, 선택, 재정렬, 애니메이션, 구분선 사용, 바닥 글, 헤더 등을 추가 할 수있는 동적 항목의 목록 및 그리드를 쉽게 작성할 수 있습니다.

겁내지 말고 RecyclerView를 사용해보십시오. 웹에서 다운로드 한 100 가지 항목 (Facebook 뉴스와 같은)을 ListView와 RecyclerView에서 만드는 것을 좋아할 수 있습니다 .UX (사용자)의 차이점을 볼 수 있습니다 경험) 스크롤하려고하면 테스트 앱이 중지되기 전에 중지 할 수 있습니다.

쉬운 어댑터를 만들기 위해이 두 라이브러리를 확인하는 것이 좋습니다.

mikepenz의 FastAdapter

davideas의 FlexibleAdapter


1
두 제품의 성능 차이에 대한 귀하의 의견이 과장된 것 같습니다. 2012 년부터 프로덕션 앱에서 ListView를 사용해 왔으며 각 행에 ~ 10 개의 서로 다른 뷰가있는 최대 3000 개의 항목을 표시했습니다. 이전 Android 2.3 장치에서도 성능 문제가 전혀 없습니다.
Magnus W :

0

리사이클 러보기 정보

RecyclerView도입되었습니다 Android 5.0 (Lollipop). 지원 라이브러리에 포함되어 있습니다. . 따라서 Android API 레벨 7과 호환됩니다.

마찬가지로으로 ListView, RecyclerView’s주요 아이디어는 성능 친화적 인 방식으로 기능을 목록으로 제공하는 것입니다. 이 뷰 이름의 '리사이클 러'부분은 우연의 일치가 아닙니다. 는 RecyclerView실제로 현재 일하고있는 항목을 재활용 할 수 있습니다. 재활용 프로세스는 View Holder 라는 패턴 덕분에 수행됩니다 .

RecyclerView의 장단점

장점 :

  • 항목 추가, 업데이트 및 제거를위한 통합 애니메이션
  • ViewHolder 패턴을 사용하여 뷰를 재활용합니다.
  • 그리드와리스트 모두 지원
  • 수직 및 수평 스크롤 지원
  • DiffUtil과 함께 사용할 수 있습니다

단점 :

  • 복잡성을 추가
  • OnItemClickListener 없음

목록보기 정보

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.