当前位置: 首页 > 知识库问答 >
问题:

在LoadInitial回调之前调用LiveData上的观察者

洪宇定
2023-03-14

在我正在工作的一个项目中,我使用了paginglibrary和Reverfit。这是我第一次这么做。

数据正常返回。但是我注意到我的viewmodel(更确切地说是我的LiveData)中的观察者在我的PageKeyedDataSource中的LoadIsitial回调之前被调用。这将使传递给适配器的列表为空。为什么在我回调之前调用Observer?

public GameDataViewModel(){
        GameResponseDataSourceFactory gameResponseViewModelFactory = new GameResponseDataSourceFactory();
        gameListLiveData = gameResponseViewModelFactory.getGameResponseMutableLiveData();

        PagedList.Config config = (new PagedList.Config.Builder())
                .setEnablePlaceholders(false)
                .setPageSize(20)
                .build();

        gameList = new LivePagedListBuilder(gameResponseViewModelFactory, config).build();
    }
final GameListAdapter gameListAdapter = new GameListAdapter();

        GameDataViewModel gameDataViewModel = ViewModelProvider.AndroidViewModelFactory.
                getInstance(this.getApplication()).create(GameDataViewModel.class);

        gameDataViewModel.gameList.observe(this, new Observer<PagedList<GameResponse>>() {
            @Override
            public void onChanged(@Nullable PagedList<GameResponse> gameResponses) {
                gameListAdapter.submitList(gameResponses);
            }
        });
Call<GameListResponse> call = HttpConnectionHandler.getInstance().getTwitchGameApi().getTopGames(CLIENT_ID,  20, null,  null);
        call.enqueue(new Callback<GameListResponse>() {
            @Override
            public void onResponse(Call<GameListResponse> call, Response<GameListResponse> response) {
                //initialLoading.postValue(DataState.SUCCESS);
                //networkState.postValue(DataState.SUCCESS);
                if(response.code() == 200) {
                    GameListResponse gameListResponse = response.body();
                    callback.onResult(gameListResponse.getGamesList(), 0, gameListResponse.getGamesList().size(), null, gameListResponse.getCursor());
                }
                else{
                    try {
                        Log.e("ERROR", response.errorBody().string());
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                }
            }

共有1个答案

武元白
2023-03-14

我最大的愚蠢之处是覆盖getItemCount并返回零。除去它,一切正常。

 类似资料:
  • 我有一个片段和一个相应的viewmodel类。我在Fragment方法上从DB获取包装为LiveData的联系人列表。它工作得很好,我使用PagedListAdapter显示联系人列表,如下所示: 我在我的片段中添加了一个观察者,如下所示: 有一个按钮在我的片段,它把我带到另一个屏幕,在那个屏幕上我添加更多的联系人到表。但当我从那个屏幕回到我的片段时,观察者并没有被调用。这意味着返回时不会调用方法

  • 如何在收到第一个结果后移除观察者?下面是我尝试过的两种代码方式,但它们都不断接收更新,即使我已经删除了观察者。

  • 在onViewCreated中,我设置了Observer对象,以便在LiveData中所做的任何更改都可以在这里得到更改通知: 在ViewModel类中,我将LiveData参数设置为: 在init中,我设置了一个观察者:

  • 我使用LiveData从DB中选择信息,并将其传递给我的活动(通过DAO、Repository&Viewmodel),依赖于一段时间的日期。当我更改timespan时,我希望删除LiveData上的旧观察者,并为新的timespan创建新的观察者。 但是,在调用和(其中timespan是之前的另一个时间戳)之后,两个观察器都调用了方法,尽管旧的方法不再活动(我使用和检查了这一点) 有什么建议吗?

  • 此外,为什么Viewmodel不能观察到它自己的LiveData的变化?