RecyclerView를 사용하여 ListView를 바꿔야합니까?


232

Android Docs의 말 :

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는 listview보다 더 많은 제어 기능을 제공하므로 사용해야합니다. 그것은 조금 복잡하지만 당신은 거기에 도착하면 목록 종류의 일을 다룰 때마다 당신의 인생은 매우 쉬울 것입니다.
Sadashiv

3
선의 적이 더 낫습니다.
oldergod

답변:


118

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

RecyclerView는 목록을 사용자 정의하거나 더 나은 애니메이션을 원할 때 강력합니다. ListView의 이러한 편리한 방법은 사람들에게 많은 문제를 일으켰으므로 RecyclerView가 더 유연한 솔루션을 제공하는 이유입니다.

이주에 필요한 주요 변경 사항은 어댑터에 있습니다. 를 계속 호출 notifyDataSetChanged하려면 대부분의 애니메이션 및 바인딩 이점을 잃게됩니다. 그러나 자세한 알림 이벤트 (추가 / 제거 / 이동 / 업데이트)를 전달하도록 어댑터를 변경할 수 있으면 애니메이션과 성능이 훨씬 향상됩니다. 이러한 이벤트를 통해 RecyclerView는 올바른 애니메이션을 선택할 수 있으며 불필요한 onBind호출을 피할 수 있습니다 . 항목보기가 복잡한 경우 큰 이점을 얻을 수 있습니다. 또한 RecyclerView 주변에는 더 많은 구성 요소가 있습니다.


2
내가 100 개의 공감대를 줄 수 있다면 이 notifyDataSetChanged()방법 을 사용하면 패턴 의 이점을 활용하면서 항상 RecyclerView새로운 것을 요구하게되었습니다 . 해결책을 찾고 나는 당신의 의견을 발견했습니다. ViewHoldersViewHolder
주목받는 개발자

"항목보기가 복잡한 경우 큰 이점을 얻을 수 있습니다"라는 의견에 동의하지 않습니다. 어댑터가 3 인 경우 recyclerView가 있고, 그렇지 않으면 Recyclerview가 제대로 작동하지 않습니다. 나는 재활용을 사용하지 isRecyclable(false);않아야했고 최종 결과는 매우 느린 RecyclerView입니다. 나는 이것을 바꿀 수 없다. 다시 listview로 돌아가려면 많은 시간이 걸릴 것이다 :(
kashyap jimuliya

4
사람들은 더 많은 유형의 RV를 사용하지만 문제와 성능이없는 RV를 사용합니다. 코드에 다른 문제가 있습니다. systrace / traceview를 사용하여 진행중인 작업을 확인하십시오.
yigit

1
yigit이 언급 한 것처럼 @kashyapjimuliya , 3 if-else는 그 원인이되어서는 안됩니다. 첫째,이 if-else를 어디에 두 었는지 언급하지 않았습니다. 둘째, 재활용을 비활성화하면 속도가 느려지지 않아야합니다. 왜? 보기를 부풀리고 수행하는 findViewById()것이 보기 보다 훨씬 비싸기 때문 ViewHolder입니다.
수피

24

나에 따르면, ListView가 앱의 현재 요구를 모두 충족시키고 모든 사용 사례를 충족시키는 경우 RecyclerView로 대체 할 필요가 없습니다.

RecyclerView는 개발자의 복잡성을 증가시키는 비용으로 개발자에게 큰 힘을 제공합니다. ListView에서 쉽게 수행 할 수있는 특정 작업이 이제는 많은 불필요한 노력을 기울일 수 있습니다.

그러나 레이아웃을 가로, 세로, 격자 또는 지그재그 격자로 매끄럽게 변경할 수있는 놀라운 LayoutManager 기능과 같이 ListView로는 할 수없는 일이 많이 있습니다.

이 주제에 대한 자세한 답변을 여기 에 썼습니다 .


3
물론 RecyclerView는 복잡성을 증가 시키지만 적어도 ViewHolder 패턴을 올바르게 구현합니다.
IgorGanapolsky

ViewHolder 패턴 구현의 경우 @IgorGanapolsky +1
Sreekanth Karumanaghat

ListView를 사용하여 자신 만의 뷰 홀더 패턴을 작성할 수 있습니다.
dan

9

1 인터페이스를 사용하여 클릭 리스너를 제공 할 수 있습니다. 이 기술도 ListView와 함께 사용합니다.
2 없음 디바이더 : 간단히 폭으로 행 뷰에 추가 match_parent 과의 높이 1DP 및 그것에게주는 배경 색상을 .
3 행 배경에 StateList 선택기를 사용하십시오.
4 addHeaderView는 ListViews에서도 피할 수 있습니다. 헤더를 외부에 두십시오. . 보기 됩니다.

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


19
이것들은 내 질문이 아니며, 각 문제 솔루션에 대한 링크가 있습니다
Xcihnegn

6

최근까지도 매우 간단한 목록에 여전히 ListView를 사용했습니다. 예를 들어 간단한 텍스트 옵션 목록을 표시하려면 ...

나는 '인적 요소'에 대한 결정을 기반으로, 성능이 중요하지 않은 경우 적은 코드로 간단한 ListView를 만드는 것이 좋습니다. 나는 종종 대학 교수가 "파스칼의 발명가 인 위대한 Niclaus Wirth 선생님은 프로그램에 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가 완벽하게 작동합니다. ListView를 사용하는 마지막 실제 이유는 이제 기본 RecylerView를 쉽게 설정할 수 있기 때문에 제거합니다.

요약하면 '레거시'라는 레이블을 지정하는 것이 더 이상 사용되지 않기 때문에 ListView를 새로운 개발에 전혀 사용하지 않을 것입니다.


3

여전히 ListView를 사용하는 것이 좋은 경우는 목록이 동적이거나 네트워크 이벤트의 영향을받지 않는 경우입니다. 예를 들어 : navigation.

다른 용도로는 RecyclerView가 ListView를 이클립스합니다. RecyclerView는 재활용에만 관심이 있기 때문에 위치 / 재 배열 변경, 애니메이션 (실제로는 RecyclerView.ItemAnimator와 함께 제공됨), 사용자 지정 레이아웃 (주식에 StaggeredGrid가 있음)과 같이 ListView에서 밀접하게 연결된 시각적 관련 작업을 수행하는 것이 더 쉬울 것입니다 이전 목록 또는 그리드 스타일이지만 더 확장되는 라이브러리 도 있습니다).

또한 CardView를 사용하려면 이것이 유일한 방법이라고 생각합니다 ( 카드 또는 목록을 사용할 때 좋은 독서 ).


서버에서 데이터 목록을 가져 와서 전화로 sqlite에 저장하여 목록 표시에 사용하는 경우 (팔로어를 말할 수 있음) 뷰 홀더가있는 목록보기보다 재활용 뷰를 사용하는 것이 좋습니다 ?
Lion789

예. 그러나 정확하게 말하면 탐색을 제외하고 더 이상 ListView에 대한 역할을 보지 못하므로 거기에서 RecyclerView를 사용하는 것이 과도하다고 생각하기 때문입니다.
inmyth

2

좋은 대안은 BaseAdapter를 사용하는 것입니다. Viewholder 패턴 사용을 지원하며 비트 맵과 버튼이있는 100 개 이상의 행이 포함되어 있으며 매우 부드럽게 실행됩니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.