ViewPager 带有视图模型和实时数据,所有 6 个标签数据都被最后一个标签数据替换

卡西克科兰吉

我对工作ViewPager有6个tabs地方只有一个片段TimesListFragment

根据传递给TimesListFragment的参数调用 api 例如;科学、技术、旅游等

我已经GithubBrowserSample为我的应用关注了谷歌

我有TimesListFragment-> TimesViewModel->TimesRepository

有 6 个选项卡,当我点击 api 时,所有选项卡都显示相同的结果,如果是最后一个 argument

StoriesPagerAdapter.kt

class StoriesPagerAdapter(fragmentManager: FragmentManager?)
    :FragmentStatePagerAdapter(fragmentManager){
    private val sections= arrayListOf("science","technology","business","world","movies","travel")
    override fun getItem(position: Int): Fragment {
        return TimesListFragment.newInstance(sections[position])
    }
    override fun getCount(): Int {
        return sections.size
    }
    override fun getPageTitle(position: Int): CharSequence? {
        return sections[position]
    }
}

问题:所有选项卡都显示travel参数数据

时间视图模型

class TimesViewModel @Inject constructor(private val timesRepository: TimesRepository) :
        ViewModel() {
    lateinit var data: LiveData<Resource<TimesStoriesResponse>>
    fun fetchStories(section:String): LiveData<Resource<TimesStoriesResponse>> {
        data = timesRepository.loadStories(section)
        return data
    }
}

TimesRepository.kt

class TimesRepository @Inject constructor(private val apiService: ApiService,
                                          private val timesDao: TimesDao,
                                          private val appExecutors: AppExecutors) {

    private val repoListRateLimit = RateLimiter<String>(10, TimeUnit.MINUTES)

    fun loadStories(section:String): LiveData<Resource<TimesStoriesResponse>> {
        return object : NetworkBoundResource<TimesStoriesResponse, TimesStoriesResponse>(appExecutors) {
            override fun saveCallResult(item: TimesStoriesResponse) {
                timesDao.insert(item)
            }

            override fun shouldFetch(data: TimesStoriesResponse?): Boolean {
                return data == null  || repoListRateLimit.shouldFetch(section)
            }

            override fun loadFromDb() = timesDao.load()

            override fun createCall() = apiService.getTopStories(section,ConfigConstant.TIMES_KEY)

            override fun onFetchFailed() {
                repoListRateLimit.reset(section)
            }
        }.asLiveData()
    }

接口服务.kt

interface ApiService {
    @GET("svc/topstories/v2/{section}.json?")
    fun getTopStories(@Path ("section") section:String,@Query("api-key") apiKey:String)
            :LiveData<ApiResponse<TimesStoriesResponse>>
}

TimesListFragment.kt

private fun initViewModel() {

        viewModel = ViewModelProviders.of(this, viewModelFactory).get(section,TimesViewModel::class.java)

    }

    private fun initData() {
        viewModel?.fetchStories(section)?.observe(this, Observer {

            when (it?.status) {

                Status.LOADING -> {
                    showLoading(true)
                    showError(false,null)
                }


                Status.SUCCESS -> {
                    showLoading(false)
                    showError(false,null)
                    showSuccessData(it.data)
                }

                Status.ERROR -> {
                    showLoading(false)
                    showError(true,it.message)
                }

            }
        })
    }

注意:这两种方法都是在 onViewCreated() 中调用的 TimesListFragmnet

杰基

这应该是由于您的ViewModel.

通常,由于 a的设计工作方式,ViewModel每个Activityor都有一个其中,在利用的主要好处是,它的生命周期是完全从你的生命周期中分离出来,因此,你可以破坏并重新创建多次,你仍然能够恢复存储在用户当前数据FragmentViewModelViewModelFragmentFragmentViewModel

因此,这意味着使用ViewModel获取 的典型代码ViewModelProviders,您将获取完全相同的ViewModel.

通常情况下,这不会造成问题,但在你的ViewPager,你重复使用相同的TimesListFragment这是最有可能调用相同ViewModel,因此使每个片段显示相同的数据。

对此的解决方案是使用:

ViewModelProviders.of(this).get(KEY, TimesViewModel::class.java)

请注意用于区分需要获取的 ViewModel 的 KEY。因此,通过使用 中的位置ViewPager作为唯一键,您应该能够ViewModel为每个TimesListFragment.

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

带有Viewpager2片段的实时数据

来自分类Dev

sed:抓取并替换最后一个反斜杠和逗号之间的所有数据

来自分类Dev

BarChart / LineChart-仅显示最后一个数据点的标签

来自分类Dev

如何将Geom标签应用于最后一个值数据点

来自分类Dev

仅将数据标签添加到最后一个值

来自分类Dev

Javascript替换第一个和最后一个字体标签

来自分类Dev

带有ListView的Android ViewPager在调用notifyDatasetchanged时无法记住最后一个位置

来自分类Dev

Viewpager禁用滑动和标签上的最后一页

来自分类Dev

Jquery 用另一个替换标签,保留数据

来自分类Dev

带有ViewPager Android的固定标签

来自分类Dev

使用ViewPager使一个片段具有多个视图

来自分类Dev

如何在熊猫数据框中将最后一个值与之前的6个值进行比较?

来自分类Dev

Viewpager检测第一个和最后一个位置

来自分类Dev

如何在子图中显示所有标签。我有12个标签,我必须绘制一个混淆矩阵。但其中只有6个可见

来自分类Dev

标签没有显示(ViewPager)

来自分类Dev

所有值都被 For 循环 TypeScript 中的最后一个值替换

来自分类Dev

具有一个EF6模型(数据库优先)和一个代码优先的解决方案

来自分类Dev

ViewPager代表数据数组

来自分类Dev

Viewpager与asynctask中的数据

来自分类Dev

ViewPager代表数据数组

来自分类Dev

在python中递归定义一个列表,列表中的所有内容都被最后一个项目替换

来自分类Dev

如何直接在 ViewPager 中更新下一个片段的数据?

来自分类Dev

从下一个HTML标签获取数据

来自分类Dev

JavaEE 6检索另一个用户的数据

来自分类Dev

prettycheckable-使用第一个复选框的数据设置所有标签

来自分类Dev

正则表达式替换html标签中的第一个和最后一个空格

来自分类Dev

在Arduino上记录带有中断的实时数据收集

来自分类Dev

带有实时数据的Kotlin Elvis声明

来自分类Dev

从视图模型获取数据时,选择标签助手呈现一个空列表

Related 相关文章

  1. 1

    带有Viewpager2片段的实时数据

  2. 2

    sed:抓取并替换最后一个反斜杠和逗号之间的所有数据

  3. 3

    BarChart / LineChart-仅显示最后一个数据点的标签

  4. 4

    如何将Geom标签应用于最后一个值数据点

  5. 5

    仅将数据标签添加到最后一个值

  6. 6

    Javascript替换第一个和最后一个字体标签

  7. 7

    带有ListView的Android ViewPager在调用notifyDatasetchanged时无法记住最后一个位置

  8. 8

    Viewpager禁用滑动和标签上的最后一页

  9. 9

    Jquery 用另一个替换标签,保留数据

  10. 10

    带有ViewPager Android的固定标签

  11. 11

    使用ViewPager使一个片段具有多个视图

  12. 12

    如何在熊猫数据框中将最后一个值与之前的6个值进行比较?

  13. 13

    Viewpager检测第一个和最后一个位置

  14. 14

    如何在子图中显示所有标签。我有12个标签,我必须绘制一个混淆矩阵。但其中只有6个可见

  15. 15

    标签没有显示(ViewPager)

  16. 16

    所有值都被 For 循环 TypeScript 中的最后一个值替换

  17. 17

    具有一个EF6模型(数据库优先)和一个代码优先的解决方案

  18. 18

    ViewPager代表数据数组

  19. 19

    Viewpager与asynctask中的数据

  20. 20

    ViewPager代表数据数组

  21. 21

    在python中递归定义一个列表,列表中的所有内容都被最后一个项目替换

  22. 22

    如何直接在 ViewPager 中更新下一个片段的数据?

  23. 23

    从下一个HTML标签获取数据

  24. 24

    JavaEE 6检索另一个用户的数据

  25. 25

    prettycheckable-使用第一个复选框的数据设置所有标签

  26. 26

    正则表达式替换html标签中的第一个和最后一个空格

  27. 27

    在Arduino上记录带有中断的实时数据收集

  28. 28

    带有实时数据的Kotlin Elvis声明

  29. 29

    从视图模型获取数据时,选择标签助手呈现一个空列表

热门标签

归档