我有一个Android应用程序(Java(,它为节目调用api。在节目返回后,我需要按季节过滤节目列表&然后按集。我目前正在对片段中的列表进行排序,因为我还没有在视图模型中找到一个好的解决方案。
这是我在vm中的调用:
public MutableLiveData<ArrayList<Titles>> getTitlesListLiveData(){
return repository.getTitlesLiveData();
}
这就是我在片段中对其进行排序的方式:
titlesViewModel.titlesListLiveData.observe(getViewLifecycleOwner(), titles -> {
for (Titles title : titles) {
titlesList.add(title);
}
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
titlesList.sort(Comparator.comparing(Titles::getSeasonNumber).thenComparing(Titles::getEpisodeNumber));
}
binding.rvTitles.setAdapter(ShowTitlesAdapter);
ShowTitlesAdapter.setShowTitlesList(titlesList);
});
titlesViewModel.getAllTitles(ShowTag);
我发现了这一点,但我不明白如何在Java或我的视图模型中做到这一点。有人能帮忙吗?
更新:我试着在我的ViewModel&它不起作用:
public LiveData<List<String>> seasonsListLiveData;
seasonsListLiveData = Transformations.switchMap(titlesListLiveData, titles-> titles.sort(Comparator.comparing(Titles::getSeasonNumber).thenComparing(Titles::getEpisodeNumber));
我得到的错误:必需类型:LiveData<列表>提供:LiveData不存在类型变量Y的实例,因此void符合LiveData
还尝试使用Transformations.map((&收到了相同的错误。
只需使用LiveData转换。在你的情况下,它可能是这样的:
public LiveData<List<Titles>> getTitlesListLiveData()
{
return Transformations.map( repository.getTitlesLiveData(), titles ->
titles.sort(Comparator.comparing(Titles::getSeasonNumber).thenComparing(Titles::getEpisodeNumber))
);
}
此外,您不必每次数据更改时都设置适配器:
binding.rvTitles.setAdapter(ShowTitlesAdapter);
您可以设置一次,例如在onCreate(在活动中时(或onCreateView(在片段中时(中。然后,当数据发生变化时,只需调用setShowTitlesList
即可更改适配器中的数据