2017-12-08 13 views
0

안드로이드 어댑터 내에서 뷰를 사용하고 onBindViewHolder 내에서 액세스 할 때 발표자는 MosBy로 MVP 안드로이드 뷰 (액티비티 또는 프래그먼트가 아님)를 구현하려고합니다. 현재 초기화되지 않았습니다. 발표자가 Null이므로 onBindViewHolder가 완료 될 때까지 onAttachWindow가 호출되지 않는 것으로 보입니다. 다음은 내가 만든 추상 클래스입니다.비 ViewGroup MVP 구현 Mosby로 안드로이드 뷰

public abstract class MvpImageView<V extends MvpView, P extends MvpPresenter<V>> 
    extends AppCompatImageView implements MvpView, ViewGroupDelegateCallback<V, P> { 

    protected P presenter; 
    protected ViewGroupMvpDelegate<V, P> mvpDelegate; 
    private boolean retainInstance = false; 

    public MvpImageView(Context context) { 
    super(context); 
    } 

    public MvpImageView(Context context, AttributeSet attrs) { 
    super(context, attrs); 
    } 

    public MvpImageView(Context context, AttributeSet attrs, int defStyleAttr) { 
    super(context, attrs, defStyleAttr); 
    } 

    /** 
    * Get the mvp delegate. This is internally used for creating presenter, attaching and detaching 
    * view from presenter etc. 
    * 
    * <p><b>Please note that only one instance of mvp delegate should be used per android.view.View 
    * instance</b>. 
    * </p> 
    * 
    * <p> 
    * Only override this method if you really know what you are doing. 
    * </p> 
    * 
    * @return {@link ViewGroupMvpDelegate} 
    */ 
    @NonNull protected ViewGroupMvpDelegate<V, P> getMvpDelegate() { 
    if (mvpDelegate == null) { 
     mvpDelegate = new ViewGroupMvpDelegateImpl<>(this, this, true); 
    } 

    return mvpDelegate; 
    } 

    @Override protected void onAttachedToWindow() { 
    super.onAttachedToWindow(); 
    Log.d(getClass().getName(), "Attaching to Window"); 
    getMvpDelegate().onAttachedToWindow(); 
    } 

    @Override protected void onDetachedFromWindow() { 
    super.onDetachedFromWindow(); 
    Log.d(getClass().getName(), "Detaching from Window"); 
    getMvpDelegate().onDetachedFromWindow(); 
    } 

    @SuppressLint("MissingSuperCall") @Override protected Parcelable onSaveInstanceState() { 
    return getMvpDelegate().onSaveInstanceState(); 
    } 

    @SuppressLint("MissingSuperCall") @Override 
    protected void onRestoreInstanceState(Parcelable state) { 
    getMvpDelegate().onRestoreInstanceState(state); 
    } 

    /** 
    * Instantiate a presenter instance 
    * 
    * @return The {@link MvpPresenter} for this view 
    */ 
    public abstract P createPresenter(); 

    @Override public P getPresenter() { 
    return presenter; 
    } 

    @Override public void setPresenter(P presenter) { 
    this.presenter = presenter; 
    } 

    @Override public V getMvpView() { 
    return (V) this; 
    } 

    @Override public final Parcelable superOnSaveInstanceState() { 
    return super.onSaveInstanceState(); 
    } 

    @Override public final void superOnRestoreInstanceState(Parcelable state) { 
    super.onRestoreInstanceState(state); 
    } 
} 

이것은 MvpLinearLayout 구현을 기반으로합니다. 이전에 Moxy라는 또 다른 MVP 라이브러리를 사용했고 onAttachToWindow뿐만 아니라 onCreate에 대한 메소드를 위임했습니다.

나는 생성자에서 getMvpDelegate(). onAttachWindow를 호출하는 초기화 루틴을 추가 할 수 있지만 그보다는 해킹과 비슷합니다. onBindViewHolder 및 RecyclerView 내에서 사용할 때이 작업을 수행하는 방법에 대한 아이디어가 있습니까?

답변

0

어댑터에 MVP를 사용하지 마십시오. 단지 일을 복잡하고 복잡하게 만듭니다.

보기 : View/ViewHolder는 재생할 수 있으며 Presenter도 함께 재생해야합니까? 그렇다면 어떻게 구현하여 내부 발표자가 신선한 지 확인하십시오. 스크롤하는 동안 Presenter를 다시보고 어떻게 볼 수 있습니까? AdapterSet이 변경되면 어떻게 될까요? 화면 방향이 어떻게 바뀌나요?

단순히 그렇게하지 마십시오.

+0

mosby mvp는보기가 RecyclerView 또는 어댑터에 포함되어야하는 경우를 제외하고는보기와 함께 사용할 수 있습니다. View 나 ViewHolder가 재사용되고이 시점에서 발표자가 재실행하면 다시 계산할 것입니다. 다른 접근법은 ViewHolder 처리 기능으로 여기에 설명되어있는 것처럼 보입니다. https://android.jlelse.eu/recyclerview-in-mvp-passive-views-approach-8dd74633158 – kingargyle

+0

이론적으로 RecyclerView에서도 사용할 수 있지만 "라이프 사이클 View (onBindViewHolder() 및 onRecycleViewHolder() 또는 이와 비슷한 이름의) ViewHolder "lifecycle"에 대해 생각하고 있으므로 View (onAttachToWindow() 및 onDetachToWindow 생활. 그래서 RecyclerView에서 MVP 작업을하고 싶다면 (큰 실수라고 생각합니다) View Lifecycle보다는 ViewHolder lifecycle을 사용하여 자신 만의 것을 작성해야합니다. – sockeqwe

+0

장바구니 내에서 간단한 디스플레이 이상의 기능이 필요하지만 일부 상호 작용이 필요하고 동적 업데이트가 필요한 쇼핑 카트 응용 프로그램입니다. 어쩌면 내가이 일을 맡을 것입니다. 그렇다면 프로젝트에 가능한 포함시킬 수있는 요청을 항상 제출할 수 있습니다. 그것은 결국 MvpRecyclerView 또는 그와 비슷한 것일 수 있습니다. – kingargyle