gpt4 book ai didi

android - 使用 Android Paging Library 通过 FragmentPagerAdapter 在 ViewPager 中显示来自相同 2 个加载 fragment 的过滤结果

转载 作者:行者123 更新时间:2023-11-30 05:05:10 24 4
gpt4 key购买 nike

我有一个 Activity 应用程序,它以一个 fragment 为中心,该 fragment 将列出来自在线 API 的数据。我在整个应用程序中使用相同的 fragment 根据需要过滤数据。

过滤是通过将参数通过工厂传递到数据源来完成的。如果我只加载一个 fragment ,所有这些都可以正常工作。我可以很好地过滤和搜索。

尝试在 ViewPager 中加载多个 fragment 时会出现问题。例如 fragment A - 被过滤以显示 Activity 项目 fragment B - 被过滤以显示过期项目,这两个项目都将使用 FragmentPagerAdapter 显示在 ViewPager 中。当我运行应用程序时,两个 fragment 都被过期项目过滤(最后一个 fragment 添加到 viewpager)似乎 fragment A 在数据源中设置的参数立即被 fragment B 覆盖。 fragment A loadInitial 正常工作,但 loadAfter 正在使用来自 fragment B 的参数。

还应注意,如果我使 DataSource 无效(),它会毫无问题地返回正确的过滤数据。 (所以它只是在加载时我的参数被覆盖并且 loadAfter 使用不正确的参数)

尝试使用 getViewLifecycleOwner() 来干扰 Observer,试图确定我调用 DataSource 的方式是否是问题所在,尝试了各种 ViewPager 适配器 FragmentStatePagerAdapter 和 FragmentPagerAdapter。

所有检查都显示数据源获得了正确的参数,然后显示它几乎立即被覆盖。

所以问题是对 PageKeyedDataSource 的调用不是 Fragment 调用所独有的吗?为什么我的变量被另一个 fragment 覆盖。

任何人都可以告诉我应该在哪里寻找解决这个问题的方法。

旁注我使用 FragmentStatePagerAdapter 加载了三个 fragment ,其中 3 个中的 2 个是使用不同参数调用的同一 fragment 。它工作正常,因为加载了三个 fragment 后,FragmentStatePagerAdapter 显然不会初始化第三个 fragment ,直到所有内容都加载完毕,因此它不会绊倒另一个 fragment 。

最佳答案

我遇到了同样的问题, View 寻呼机加载了两个 fragment ,下一个 fragment 覆盖了值。所以我是这样做的。

在 fragment 中,我将列表设置为 View 模型。

companion object {
private const val ARG_SECOND = "arg_second"

@JvmStatic
fun newInstance(second: Array<Pair<String, String>>): PlaceholderFragment {
return PlaceholderFragment().apply {
arguments = Bundle().apply {
putString(ARG_SECOND,second[0].second)
}
}
}
}

override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
viewModel = ViewModelProviders.of(this).get(PageViewModel::class.java).apply {
setListId(arguments?.getString(ARG_SECOND) ?: "")
}
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
super.onViewCreated(view, savedInstanceState)
btn.setOnClickListener {
viewModel.setListId("my id")
viewModel.videosList.value?.dataSource?.invalidate()
}
}

在 View 模型中我创建了一个方法 setListId:

class PageViewModel(application: Application) : AndroidViewModel(application) 
{

//paging
private val networkService = NetworkService.getService()
var videosList: LiveData<PagedList<Item>>
private val compositeDisposable = CompositeDisposable()
private val pageSize = 50
private val videosDataSourceFactory: VideosDataSourceFactory

init {
videosDataSourceFactory = VideosDataSourceFactory(compositeDisposable,
networkService)
val config = PagedList.Config.Builder()
.setPageSize(pageSize)
.setInitialLoadSizeHint(pageSize)
.setEnablePlaceholders(false)
.build()
videosList = LivePagedListBuilder<String, Item>(videosDataSourceFactory,
config).build()
}

fun getState(): LiveData<State> = Transformations.switchMap<VideosDataSource,
State>
(videosDataSourceFactory.videosDataSourceLiveData,VideosDataSource::state)

fun retry() {
videosDataSourceFactory.videosDataSourceLiveData.value?.retry()
}
fun setListId(listId: String){
videosDataSourceFactory.listId = listId
}


override fun onCleared() {
super.onCleared()
compositeDisposable.dispose()
}

fun listIsEmpty(): Boolean {
return videosList.value?.isEmpty() ?: true
}
}

在数据源工厂中创建一个变量:

val videosDataSourceLiveData = MutableLiveData<VideosDataSource>()
lateinit var listId:String

override fun create(): DataSource<String, Item> {
val videosDataSource = VideosDataSource(networkService,
compositeDisposable,listId)
videosDataSourceLiveData.postValue(videosDataSource)
return videosDataSource
}

然后在这里通过数据源的构造函数获取:

class VideosDataSource(
private val networkService: NetworkService,
private val compositeDisposable: CompositeDisposable,
private val listId: String
): PageKeyedDataSource<String, Item>() {
var state: MutableLiveData<State> = MutableLiveData()
private var retryCompletable: Completable? = null

override fun loadInitial(params: LoadInitialParams<String>, callback:
LoadInitialCallback<String, Item>) {
updateState(State.LOADING)
compositeDisposable.add(
networkService.getPlaylistVideos(listId
,""
,Constants.API_KEY)
.subscribe( { response ->
updateState(State.DONE)
callback.onResult(response.items, response.prevPageToken,
response.nextPageToken)
},
{
updateState(State.ERROR)
setRetry(Action { loadInitial(params,callback) })
}
)
)
}

关于android - 使用 Android Paging Library 通过 FragmentPagerAdapter 在 ViewPager 中显示来自相同 2 个加载 fragment 的过滤结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54701264/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com