RecyclerView에서 DiffUtil을 사용하면 좀 더 효율적일 수 있는데요.

 

1. DiffUtil

클래스의 이름에서 알 수 있듯이,

 

 

구글의 공식문서에는 아래와 같이 실질적인 DiffUtil의 속도까지도 보여주고 있습니다.

재미있는 것은 1000개 아이템의 리스트에서 200개를 수정할 때도,

12millisecond밖에 않걸린다고 하는 군요.

 

 

당연히 써야할 것 같은 느낌인데요.

어떻게 사용하는지 정리해 보도록 하겠습니다.

 

2. DiffUtil 구현

2-1. Adapter의 addAll

먼저 기존의 Adapter를 보겠습니다.

리스트에 뿌려줄 아이템들을 Activity에서 받아서 추가해 주는 것을 간단히 구현한다면,

아래와 같은 형식을 취했을 텐데요.

기존의 아이템들은 clear해 주어야 하므로 clear()함수를 사용했습니다.

 

하지만, DiffUtil은 기존의 리스트를 수정된 리스트와 비교해서 빠르게 업데이트 해 주는 클래스이므로,

이제 clear를 하지않고, DiffUtil을 이용해 주겠습니다.

 

2-2. DiffUtil클래스의 구현

먼저 DiffUtil.Callback을 상속받은 Callback클래스를 생성한 다음, 아래의 함수들을 구현해 주어야 합니다.

 

getOldListSize와 getNewListSize는 리스트에서 size만 얻어오면 되므로 매우 쉽습니다.

areItemsTheSame과 areContentsTheSame은 조금 어려운데요.

공식문서의 설명을 보도록 하겠습니다.

 

 

areItemsTheSame은 두개의 객체가 같은 item인지를 보는 것이고,

areContentsTheSame은 완전히 같은 data를 가지고 있느냐의 것 입니다.

예를 들면, 김지원이라는 학생이 예전리스트에서는 80점 새로운 리스트에서는 90점이라고 하면,

areItemsTheSame에서는 true가 나와야 할 것이고,

areContentsTheSame에서는 false가 나와야 할 것 입니다.

 

이를 구현하려면, areItemsTheSame은 primary키와 같이 유니크한 값을 이용하면 됩니다.

데이터는 달라도 primary키 값으로 이용할 만한 유니크한 값은 같을 것이기 때문입니다.

(보통은 id를 많이 사용하지만, 여기서는 테스트용으로 name값을 유니크한 값을 사용하였습니다.)

areContentsTheSame의 경우는 기준을 어떻게 하느냐에 따라 다른데요.

예를 들면, score가 다르면 다른 객체를 본다면 아래와 같이 구현할 수 있구요.

모든 데이터값이 다 같아야 한다면, 그것을 다 비교해야 하겠지요.

 

3. Adapter의 구현

이제 위에서 사용한 DiffUtil을 이용하여 Adapter를 구현해 볼텐데요.

그전에 한가지 보고갈 함수가 있습니다.

바로 dispatchUpdatesTo함수인데요.

새 리스트를 세팅해 준다음 이 함수를 사용하면 adapter를 업데이트 할 수 있도록 해 줍니다.

 

이 함수를 이용해 아래와 같이 사용하면 되겠습니다.

 

 

 

 

 

 

 

+ Recent posts