android - 为什么在重新创建 fragment 时 onChange() 调用两次

标签 android viewmodel android-architecture-components android-livedata

我正在尝试使用新的 android 架构组件,但有一瞬间我很困惑。

我创建了一个 ViewModel 类

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;
}
}

在我的 LifeCycleFragment 中观察 LiveData

@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();
}

但是当我用另一个 fragment 替换这个 fragment 并切换回这个 fragment 时,方法 onChange 被调用了两次并在 rvAdapter 中添加了相同数据的两个部分。

最佳答案

我解决了这个!!! 当我创建我的 ViewModel 类时,我将“this”第一个参数传递给方法

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

但我需要传递“getActivity()”,代码看起来像这样

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

关于android - 为什么在重新创建 fragment 时 onChange() 调用两次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44863065/

相关文章:

android - 如何获得可用的 gsm 网络列表?

WPF DataGrid ItemsSource 在更改源时不会更新

ios - 无法在 ObjC 中访问 Swift ViewModel 属性

android - 从 ViewPager 获取焦点 View

android - getEdgeFlags 总是返回 0?

android - 方向改变时相机出现问题

android-fragments - 如何在 Android 的单个片段中使用多个 View 模型?

android - 在 Room 中通过 id 获取项目

Android Paging3 insertSeparators 无法按预期工作

android - 网络pojo类和数据库实体类,如何避免重复