【问题标题】:offset set with getItemOffsets disappears after scroll使用 getItemOffsets 设置的偏移量在滚动后消失
【发布时间】:2022-03-15 17:53:25
【问题描述】:

我有一个与 FlexLayoutManager 一起使用的水平 RecyclerView。我还用RecyclerView.ItemDecoration 设置了一些装饰品。 我的 getItemOffsets 方法如下所示:

override fun getItemOffsets(outRect: Rect, view: View, recyclerView: RecyclerView, state: RecyclerView.State) {
  super.getItemOffsets(outRect, view, recyclerView, state)
  val position: Int = recyclerView.getChildAdapterPosition(view)
  if(position meets some rules){
    outRect.top = some values here
  }

  if(viewType == CERTAIN_VIEW_TYPE){
    outRect.bottom = some value
  }
}

 ..onDrawOver(){ 
     //I draw the decorations here
   }

这行得通,我设置为装饰的视图显示出来并且它们在正确的位置。

我遇到的问题是,在我向右滚动然后再向左滚动后,outRect.top 设置的偏移量设置为 0,并且我的装饰与我的项目重叠。

奇怪的是outRect.bottom 设置的偏移量并没有消失或导致任何问题。

我只是指定outRect.top设置的偏移量只针对某些位置设置。

我的装饰也没有消失,只是outRect.top最初设置的边距不存在了

你能帮我解决这个问题吗?

谢谢

编辑: 我猜这可能是视图回收的结果,因为我看到滚动后其他项目现在有顶部偏移,即使我不打算为它们设置它

【问题讨论】:

    标签: android-recyclerview android-flexboxlayout item-decoration


    【解决方案1】:

    我在滚动时遇到了相同的项目偏移问题。 我的情况是-> 我有一个带有 GridLayoutManager 的 RecyclerView,方向是水平的,跨度计数设置为 2

    我在 RecyclerView 中添加了一个与我的需求相关的自定义项目装饰,只需在项目周围添加一些空间并进行计算。

    使用与您相同的覆盖函数并将值设置为顶部、底部、左侧和右侧。

    无论如何,我遇到的问题是我如何获得想要进行更改的视图的位置。

    val viewHolder = recyclerView.findContainingViewHolder(view) ?: return
    val adapterPosition = viewHolder.absoluteAdapterPosition
    val childPosition = parent.indexOfChild(view)
    val isEvenPosition = adapterPosition % 2 == 0
    

    以前我使用的是 childPosition,但在滚动时我遇到了问题,当我使用 adapterPosition 时,视图获得了正确的空间量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-10-28
      • 1970-01-01
      • 1970-01-01
      • 2015-11-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多