안드로이드 어댑터 내에서 뷰를 사용하고 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 내에서 사용할 때이 작업을 수행하는 방법에 대한 아이디어가 있습니까?
mosby mvp는보기가 RecyclerView 또는 어댑터에 포함되어야하는 경우를 제외하고는보기와 함께 사용할 수 있습니다. View 나 ViewHolder가 재사용되고이 시점에서 발표자가 재실행하면 다시 계산할 것입니다. 다른 접근법은 ViewHolder 처리 기능으로 여기에 설명되어있는 것처럼 보입니다. https://android.jlelse.eu/recyclerview-in-mvp-passive-views-approach-8dd74633158 – kingargyle
이론적으로 RecyclerView에서도 사용할 수 있지만 "라이프 사이클 View (onBindViewHolder() 및 onRecycleViewHolder() 또는 이와 비슷한 이름의) ViewHolder "lifecycle"에 대해 생각하고 있으므로 View (onAttachToWindow() 및 onDetachToWindow 생활. 그래서 RecyclerView에서 MVP 작업을하고 싶다면 (큰 실수라고 생각합니다) View Lifecycle보다는 ViewHolder lifecycle을 사용하여 자신 만의 것을 작성해야합니다. – sockeqwe
장바구니 내에서 간단한 디스플레이 이상의 기능이 필요하지만 일부 상호 작용이 필요하고 동적 업데이트가 필요한 쇼핑 카트 응용 프로그램입니다. 어쩌면 내가이 일을 맡을 것입니다. 그렇다면 프로젝트에 가능한 포함시킬 수있는 요청을 항상 제출할 수 있습니다. 그것은 결국 MvpRecyclerView 또는 그와 비슷한 것일 수 있습니다. – kingargyle