【问题标题】:How to reset the view state of a ViewHolder in ViewPager2, once it is not visible anymore?如何在 ViewPager2 中重置 ViewHolder 的视图状态,一旦它不再可见?
【发布时间】:2021-09-22 14:35:06
【问题描述】:

我正在使用ViewPager2ListAdapter 水平滚动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的函数中检索视图持有者?

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

【问题讨论】:

    标签: android android-jetpack android-viewpager2


    【解决方案1】:

    我终于找到了。

    对于给定的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的值获取一次/如果已经设置,如上图。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多