一旦不再可见,如何在 ViewPager2 中重置 ViewHolder 的视图状态?

红色字形

我使用 aViewPager2和 aListAdapter水平滚动Recycler.ViewHolder项目,一次显示一个项目。当内容不适合屏幕时,每个都可以垂直滚动。

一旦它们不再可见,我想重置它们的滚动状态,因为视图持有者可能会被另一个项目重用,并且因为它更整洁。

我知道如何在 中重置滚动状态ViewHolder,但是我可以把这段代码放在哪里

我首先想到它可能在托管 的片段中ViewPager2,在那里我可以ViewPager2.OnPageChangeCallback向 viewpager注册回调

private var lastPosition = -1
private var callback = object: ViewPager2.OnPageChangeCallback() {
    override fun onPageSelected(position: Int) {
        if (lastPosition >= 0) {
            // reset scroll here
            val v: MyViewHolder = ???(position)
            v.resetScrollState()
        }
        lastPosition = position
    }
}

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    viewpager = binding.itemPager
    viewpager.adapter = [...]
    viewpager.registerOnPageChangeCallback(callback)
}

(哪里binding.itemPager指向ViewPager2

但我不知道如何轻松访问视图持有者,除非将它存储(例如在一个集合中),以便我可以从position. 然后我仍然必须lastPosition第一次正确设置,但它是次要的。

我的问题:有什么办法

  • 将侦听器设置为页面更改,并可以访问视图持有者?
  • 或者,在函数中检索视图持有者position

或者有没有更好的方法来处理这个问题?

红色字形

我终于找到了。

对于给定的lastPosition,可以通过以下方式获得视图持有者:

(viewpager.get(0) as RecyclerView).findViewHolderForAdapterPosition(lastPosition)
    as? MyViewHolder

所以回调变成:

private var callback = object: ViewPager2.OnPageChangeCallback() {
    override fun onPageSelected(position: Int) {
        if (lastPosition >= 0) {
            // reset scroll here
            val holder = (viewpager.get(0) as RecyclerView).findViewHolderForAdapterPosition(lastPosition) as? TodoEventAdapter.MyViewHolder
            if (holder != null)
                holder.resetScroll()
        }
        lastPosition = position
    }
}

我可以设置初始值lastPosition并注册回调,例如在片段代码中使用ViewPager2.currentItem

override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
    super.onViewCreated(view, savedInstanceState)
    viewpager = binding.itemPager
    [...]
    lastPosition = viewpager.currentItem
    viewpager.registerOnPageChangeCallback(callback)
}

override fun onDestroyView() {
    [...]
    viewpager.unregisterOnPageChangeCallback(callback)
    super.onDestroyView()
}

其中binding.itemPager使用viewBinding,对应布局的ViewPager2实例。

请注意,要显示的第一个位置可能来自参数,例如需要在起始位置显示特定项目的活动。的初始值lastPosition可以从这个参数中获取也可以从ViewPager2.currentItem一次/如果已经设置的值中获取,如上所示。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

ViewPager2 /标签问题视图模型状态

在viewpager2中无限滚动

如何将图片从url加载到viewpager2中?

如何禁用ViewPager2中的滑动?

如何使用Kotlin在RecyclerView.ViewHolder中绑定视图

迁移到viewpager2时,不会加载所有上一个和下一个页面边界视图,并且viewpager2中的getPageWidth()等效方法是什么

如何在Android中动态添加和删除不同的Viewholder(例如2个Viewholder)?

如何禁用ViewPager2中特定方向的刷卡

如何在ViewPager2中实现微调

ViewPager2,获取当前页面的viewholder

如何在viewpager2的膨胀布局之一中添加RecyclerView

如何在片段中嵌套ViewPager2

如何在ViewPager2中获取当前片段

在viewpager2中禁用动画

确定何时片段在ViewPager2中不再可见

如何在android中的viewpager2中删除对象?

如何基于ViewPager2 / TabView中的Fragment更改Android活动的标题

滚动时如何重置RecyclerView Viewholder布局

recyclerView中的ViewHolder注册可见的视图位置,而不是绝对的视图位置

如何在Android RecyclerView中缓存Viewholder视图引用

在 ViewPager2 中調用下一個視圖的綁定

如何修复 ViewPager2 中的“违反设计假设”错误?

Android:在 ViewPager2 的 onPageSelected 中更改视图可见性第一次不起作用

在没有动画的情况下在 ViewPager2 中第一次滚动

如何从 ViewPager 转换为 ViewPager2

在Android中的ViewPager2上滑动到第x页时,如何使代码采取行动?

如何在回收器视图中单击的项目上将相应数据返回到 viewpager2?

当页面在 ViewPager2 中不可见时如何停止视频

如何重新启动从 viewpager2 中的活动创建的片段?