2

私は新しいアンドロイドのアーキテクチャコンポーネントを使用しようとしていますが、私は一瞬混乱しています。フラグメントが再作成されたときにonChange()が2回呼び出される理由

私は

public class BuyViewModel extends ViewModel { 

private BuyRepository buyRepository; 
private LiveData<Adverts> advertsLiveData; 
private boolean isLoading; 
private int currentPage; 

@Inject 
public BuyViewModel(BuyRepository buyRepository) { 
    this.buyRepository = buyRepository; 
} 

public void init(int currentPage) { 
    this.currentPage = currentPage; 
    if (this.advertsLiveData != null) { 
     return; 
    } 
    Timber.tag("logi").d("BuyViewModel > init -> "); 
    advertsLiveData = buyRepository.getAdverts(currentPage); 
} 

public LiveData<Adverts> getAdvertsLiveData() { 
    return advertsLiveData; 
} 
} 

@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 

    buyViewModel = ViewModelProviders.of(this, viewModelFactory).get(BuyViewModel.class); 
    buyViewModel.init(1); 
    buyViewModel.getAdvertsLiveData().observe(this, adverts -> { 
     Timber.tag("logi").d("BuyFragment > onActivityCreated -> "); 
     assert adverts != null; 
     adapter.addMoreAdverts(adverts.getResults()); 
    }); 

    setupViews(); 
} 

私LifeCycleFragmentでLiveDataを守っしかし、私は別で、このフラグメントを交換して戻ってこのフラグメントに切り替わったときに、この方法onChangeが二回呼ばれたのViewModelクラスを作成し、 rvAdapterに同じデータの2つの部分が追加されました。

答えて

4

私はこれを解決しました! 私は私のViewModelクラスを作成するとき、私は

buyViewModel = ViewModelProviders.of(**this**, viewModelFactory).get(BuyViewModel.class);

方法

に "この" 1-番目のパラメータを渡すしかし、私は "getActivityを()" を渡す必要があり、コードはその

buyViewModel = ViewModelProviders.of(**getActivity()**,viewModelFactory).get(BuyViewModel.class);

のように見えます
+0

これを行うためにinorderで行った変更は何でしたか? –

+0

http://joxi.ru/Q2KG4w7f9lRZb2 screenshootへのリンク – kovac777

0

フラグメント内に "this"を渡しているときは、フラグメントのインスタンスが必要です。設定を変更した後、フラグメントのonDestroy()はunsubsriptionを実行する必要があるが、onDestroyView()のみを呼び出すことはありません。したがって、アクティビティのインスタンスが渡されたときに、そのアクティビティのonDestroy()が呼び出されたため、unsubsribedされました。

関連する問題