1

最近我开始为自定义滚动工作,RecyclerView但遇到了一个问题。我做了标题视差,效果很好,但是当你滚动时我想让行扩展。对于这种方法,我需要使用recyclerView.computeVerticalScrollOffset()它来处理列表中的前两项,但随后它就分崩离析了。

这是我的代码示例:

FrameLayout main = (FrameLayout) holder.itemView;
if (main != null) {
    int height = calculateHeight(offset, (position + i));
    RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) main.getLayoutParams();
    lp.height = height;
    main.setLayoutParams(lp);
}

所以我有一个函数可以根据布局中的位置和recyclerview的偏移量计算高度。当第二个项目到达Y == 0偏移量下降一半(即从1200下降到600然后它继续但计算都是错误的)

关于如何获得稳定的偏移值或如何用与 recyclerView 位置一致的东西来改变它的任何想法。

编辑:

好的,我可以逐步描述问题:

  • 适配器位置(0)处的元素高度为 1200
  • 所有其他元素的默认高度为 300
  • 当用户开始向下滚动时,位置(1)处的元素开始从 300 扩展到 1200 高度

--------- 这是代码开始破解的地方...... ------------

  • 当位置(1)处的元素新高度为 1200 到达屏幕顶部时(此时getTop() == 0),此处的偏移量约为 900。
  • 当同一个元素开始离开屏幕(用户向下滚动)时,顶部屏幕和该元素碰撞(0,0)处的偏移量减少了一半,因此偏移量现在是 450,而应该是 900,然后它从 450 开始,但我在位置(1)的元素现在只有它应该大小的一半......
4

1 回答 1

2

好的,我为此解决方案创建了一个解决方法,如果将来有人需要,我将其发布为答案。

计算自己的偏移量:

public int offsetForVerticalScrolling(RecyclerView recyclerView) {
    LinearLayoutManager llm = (LinearLayoutManager) recyclerView.getLayoutManager();

    int position = llm.findFirstVisibleItemPosition();
    ViewHolder mViewHolder = (ViewHolder) recyclerView.findViewHolderForAdapterPosition(position);
    View item = mViewHolder.itemView;

    int y = (int) item.getY();
    if (y < 0) y *= -1;

    if (position == 0) return y;
    else {
        int offset = y;
        for (int i = 0; i < position; i++) {
            //Add your previous item heights to offset
        }
        return offset;
    }
}
于 2015-12-19T00:41:36.883 回答