이번에는 Adapter에 대한 Contract 정의하는 방법을 살펴보려 한다. 여기서는 Adapter에 대한 Contract를 정의하고 이를 상속받아서 사용하는 방법을 정리해보겠다.

Adapter Contract 정의란?

이전 글에서 Activity/Fragment에서 사용할 Contract을 정의하고, 분리해보았다. 하지만 아래와 같이 처리한다.

복잡해보이지만 정리하면 아래와 같다.

  • View : Presenter에게 데이터를 요청
  • Presenter : Model에게 데이터를 요청
  • Model : 데이터를 Presenter로 전달
  • Presenter : Model로부터 전달받은 데이터를 View에게 전달
  • View : View에서 가지고 있던 Adapter에게 데이터를 추가하고, notify를 처리

Presenter에서 직접 data를 전달하지 않으면?

MVP 방식을 분리만 하면 위에서 설명한 그림과 같이 동작한다. 그럼 단점은 무엇일까??

단점
Presenter에서 Adapter의 데이터를 저장하고 불러오는 모든 부분에 항상 View가 함께 해야 한다.

  • Presenter에서 Adapter에 데이터를 세팅하는 경우
    • View에서 이를 전달받아 Adapter에 저장
  • 사용자의 onClick 시에 필요한 데이터를 Adapter로부터 전달받아야 하므로 필요한 함수(getItem)가 만들어져야 한다.

위와 같은 상황이 아니더라도 모두 View에서 이를 대신 받아서 전달해야 한다. 그럼 복잡도를 낮추려는 목적이 사라짐과 동시에 복잡도가 높아지고 귀찮아진다.

그래서 좀 더 좋은 방법은??

좀 더 좋은 방법은 GDE 스티브님의 글에서 소개된 방법이다. 이 글은 아래에 참고 링크를 걸어두었으니 나중에 확인해보자!

다음과 같이 Adapter에 대한 Contract를 다시 생성해준다.

1
2
3
4
5
6
7
8
9
interface AdapterContract{
interface View{

}

interface Model{

}
}

Contract을 Adapter에 상속받아 구현

View/Model을 구분해서 Contract을 생성하였으니, Adapter에서 이를 상속받아서 구현해준다.

1
2
3
class SampleAdapter : RecyclerView.Adapter(), AdapterContract.View, AdapterContract.Model{
// 생략
}

Presenter에서는?

Presenter에서는 AdapterContract.View와 AdapterContract.Model을 구현한다.

1
2
3
4
5
6
7
8
9
10
11
12
class SamplePresenter implements SampleContract.Presenter{
private AdapterContract.View adapterView;
private AdapterContract.Model adapterModel;

public void setAdapterView(AdapterContact.View adapterView){
this.adapterView = adapterView
}

public void setAdapterModel(AdapterContract.Model adapterModel){
this.adapterModel = adapterModel
}
}

이렇게 구현해주면 이후에는 adapterVie/adapterModel을 통해서 직접 Adapter를 접근하게 된다. 기존에서와 같이 View를 통해서 접근할 필요성이 없어진다. 그래서 다시 그리면 아래와 같다.

참고