我使用 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] 删除。
我来说两句