【问题标题】:RecyclerView not updated only in adjacent (second) tab of FragmentPagerAdapterRecyclerView 仅在 FragmentPagerAdapter 的相邻(第二个)选项卡中不更新
【发布时间】:2021-03-06 21:43:58
【问题描述】:

我有一个带有 4 个标签或片段的 FragmentPagerAdapter (tabFragmentAdapter)。 每个片段都有一个RecyclerViewadapter。 Ever holder 是一个带有移除按钮的卡片列表。

当我按下删除按钮时,卡片会从当前片段中删除:

adapter?.notifyDataSetChanged()

但问题是我希望在每个标签中删除卡片。但是当我向右滑动时,它仍在第二个标签中,但不在第三个第四个标签中。

当我覆盖getItemPosition 并返回POSITION_NONE

override fun getItemPosition(fragment: Any): Int {
    // POSITION NONE, so that it reloads every time.
    return POSITION_NONE
}

我有同样的问题,我看到屏幕有一点明显的拉扯。

当我从第四个位置滑回第一个位置时,第二个选项卡会更新并正确显示。

一种解决方案是调用:

tabFragmentAdapter?.notifyDataSetChanged()

但这会使列表短暂消失并再次显示。这不是一个很好的效果。

当我添加addOnTabSelectedListener时,App挂了。

    val tabs: TabLayout = findViewById(R.id.tabs)
    tabs.setupWithViewPager(viewPager)
    tabs.addOnTabSelectedListener(object: TabLayout.OnTabSelectedListener {
        override fun onTabSelected(tab: TabLayout.Tab?) {
            Log.d("","")
        }

        override fun onTabUnselected(tab: TabLayout.Tab?) {
            Log.d("","")
            tabFragmentAdapter?.notifyDataSetChanged()
        }

        override fun onTabReselected(tab: TabLayout.Tab?) {
            Log.d("","")
        }
    })

我试过this所以回答

【问题讨论】:

    标签: android kotlin fragmentstatepageradapter


    【解决方案1】:

    在 FragmentPageAdapter 中,当前可见片段的相邻片段处于活动状态,视图被创建。当您更改当前片段中的某些内容时,您会通知该片段的视图,某些内容已更改并且视图会自行更新。

    相邻的片段不知道这些变化,你必须以某种方式通知他们,提供的代码我不知道你怎么做。我个人会使用与活动相关联的视图模型,每个片段都访问此视图模型并开始观察其 onResume 中的数据并在发生变化时更新视图。

    不与当前片段相邻的片段将停止,并在它成为当前片段的相邻片段时创建视图。创建视图后,您将获得当前数据状态的视图,同时更新您之前的视图。

    我希望这可以帮助您找到如何以及何时更新您的视图的解决方案。

    【讨论】:

    • 我已经发布了我的解决方案。 ViewModel 触发 MainActivity 中的一个方法,这将传递索引和要删除的项目。不完美,但它有效。
    【解决方案2】:

    这是我的解决方法。它有效,但可能会更好。

    class TabFragmentAdapter(fragmentManager: FragmentManager,
                             private val tabFragments: List<VersesFragment>) : FragmentStatePagerAdapter(fragmentManager, BEHAVIOR_RESUME_ONLY_CURRENT_FRAGMENT) {
    
        fun refresh(verse: Verse, index: Int) {
            if (index == 0 && tabFragments.size > 1) {
                // First one
                tabFragments[index+1].adapter?.removeCorrectItem(verse)
                tabFragments[index+1].adapter?.notifyDataSetChanged()
    
            } else if (index == (tabFragments.size-1) && tabFragments.size > 1) {
                // Last one
                tabFragments[index-1].adapter?.removeCorrectItem(verse)
                tabFragments[index-1].adapter?.notifyDataSetChanged()
    
            } else if (index > 0 && index < tabFragments.size) {
                tabFragments[index - 1].adapter?.removeCorrectItem(verse)
                tabFragments[index - 1].adapter?.notifyDataSetChanged()
    
                tabFragments[index + 1].adapter?.removeCorrectItem(verse)
                tabFragments[index + 1].adapter?.notifyDataSetChanged()
            }
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-12-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多