RecyclerView 객체를 사용자 설정할 수 있음, RecyclerView로 동적 목록 만들기에서 설명된 표준 클래스는 대부분의 개발자가 필요하는 모든 기능을 제공함, 대부분의 경우 각 뷰홀더를 위한 뷰와 적합한 데이터로 해당 뷰를 수정하는 코드만 설계하면 됨, 하지만, 앱이 특정 요구사항을 만족해야 한다면 다양한 방식으로 동작을 수정할 수 있음RecyclerView 는 개별 아이템의 위치를 정할 때와 사용자에게 보이지 않게 된 아이템을 언제 재사용할지 정할 때 레이아웃 매니저를 사용함, 뷰를 재사용하려면 레이아웃 매니저가 어댑터에게 데이터셋의 다른 요소로 뷰의 내용을 교체하라고 요청함, 이렇게 뷰를 재사용하는 것은 성능을 개선하고 불필요하게 뷰를 생성하거나 리소스를 많이 사용하는 findViewById() 를 사용한 조회를 방지함, 안드로이드 지원 라이브러리는 세가지의 표준 레이아웃 매니저를 포함함, 각각은 다양한 사용자 지정 옵션을 제공함
LinearLayoutManager : 아이템을 일차원 리스트로 정렬함, LinearLayoutManager 를 사용하는 RecyclerView 는 ListView 레이아웃과 같은 기능을 제공함GridLayoutManager : 아이템을 체스보드의 네모 칸같이 이차원 그리드로 정렬함, GridLayoutManager 를 사용한 RecyclerView 는 GridView 레이아웃과 같은 기능을 제공함StaggeredGridLayoutManager : 아이템을 각 열이 미국 국기의 별처럼 앞의 열에서 살짝 떨어져 있는 이차원 그리드로 정렬함만약 이 레이아웃 매니저가 필요에 맞지 않는다면 RecyclerView.LayoutManager 추상 클래스를 확장해 새로 만들어야 함
RecyclerView 는 animator 를 사용해 모양을 변경함, animator 는 RecyclerView.ItemAnimator 추상 클래스를 확장한 객체임, 기본적으로 RecyclerView 는 DefaultItemAnimator 를 사용해 애니메이션을 제공함, 사용자 지정 애니메이션을 제공하려면 RecyclerView.ItemAnimator 를 확장해 직접 animator 객체를 정의해야 함recyclerview-selection 라이브러리는 RecyclerView 목록의 항목을 사용자가 터치나 마우스 입력으로 선택할 수 있게 해줌, 이는 선택된 아이템의 시각적 표현을 제어할 수 있게 해줌, 또한 몇 개의 아이템이 선택 가능한지, 어느 아이템이 선택 가능한지와 같은 선택 동작을 제어할 수 있게 해줌
RecyclerView 인스턴스에 선택을 지원하려면 다음 단계를 따라야 함
사용할 선택 키 유형을 결정하고 ItemKeyProvider 를 빌드함
선택된 아이템을 식별하는 데 사용할 수 있는 세 가지 키 유형은 다음과 같음
Parcelable 과 Uri 와 같은 서브 클래스StringLongSelectionTracker.Builder 를 확인ItemDetailsLookup 을 구현함
ItemDetailsLookup 은 선택 라이브러리가 주어진 MotionEvent 에서 RecyclerView 아이템의 정보에 대해 접근할 수 있게 함, 그것은 사실상 RecyclerView.ViewHolder 인스턴스를 기반으로 하거나 인스턴스에서 추출한 ItemDetails 인스턴스의 팩토리 역할을 함
RecyclerView 의 아이템의 View 객체를 사용자가 선택하거나 선택 해제를 한 것을 반영하기 위해 수정함
선택 라이브러리는 선택된 아이템을 위한 기본 시각 효과를 제공하지 않음, onBindViewHolder() 를 구현할 때 이를 제공해야 함, 다음과 같이 접근하는 것을 추천함
onBindViewHolder() 에서 아이템이 선택되었는지에 따라 View 객체에서 setActivated() 를 호출사용자에게 선택에 대한 동작을 수행할 도구를 제공하도록 ActionMode 를 사용함
선택이 변경될 때 알림을 받으려면 SelectionTracker.SelectionObserver 를 등록해야 함, 선택이 처음 생성되면 ActionMode 를 시작해 사용자에게 선택되었다는 것을 알리고 선택 관련 동작을 제공함, 예시로 ActionMode 바에 삭제 버튼을 추가하고 바의 뒤로가기를 선택 해제로 연결할 수 있음, 사용자가 마지막으로 선택 해제를 해 선택이 비었을 때 액션 모드를 종료함
해석된 모든 2차 행동 실행
이벤트 처리 파이프라인의 끝에서 라이브러리는 사용자가 아이템을 탭해서 활성화하려고 하는지, 아니면 선택된 아이템들을 드래그하려고 하는지를 해석할 수 있음, 해석된 행동에 대해 적절한 리스너를 등록해 반응할 수 있음
SelectionTracker.Builder 에서 모든 것을 조합
다음 예제는 모든 것을 합치는 방법을 보여줌
var tracker = SelectionTracker.Builder(
"my-selection-id",
recyclerView,
StableIdKeyProvider(recyclerView),
MyDetailsLookup(recyclerView),
StorageStrategy.createLongStorage())
.withOnItemActivatedListener(myItemActivatedListener)
.build()
SelectionTracker 인스턴스를 생성하려면 앱은 반드시 RecyclerView 를 초기화하는데 사용한 RecyclerView.Adapter 를 SelectionTracker.Builder 에 제공해야 함, 이에 따라 SelectionTracker 인스턴스를 생성하면 RecyclerView.Adapter 에 삽입해야 함, 그렇지 않으면 onBindViewHolder() 메소드에서 아이템이 선택되었는지 여부를 확인할 수 없음
선택을 액티비티 생명주기 이벤트에 포함하기
선택 상태를 액티비티 생명주기 이벤트 동안 보존하려면 앱은 만드시 선택 트래커의 onSaveInstanceState() 와 onRestoreInstanceState() 메소드를 각각 액티비티의 onSaveInstanceState() 와 onRestoreInstanceState() 메소드에서 호출해야 함, 앱은 반드시 고유한 선택 ID를 SelectionTracker.Builder 생성자에 제공해야함, 이 ID는 액티비티나 프래그먼트에서 하나 이상의 선택 가능한 리스트를 가질 수 있고, 각각 모두 상태가 저장되어야 하므로 필요함
원문: https://developer.android.com/develop/ui/views/layout/recyclerview-custom