gpt4 book ai didi

android - 修改垂直 LinearLayoutManager 使其也可以水平滚动(包括视频)

转载 作者:行者123 更新时间:2023-11-29 20:53:37 26 4
gpt4 key购买 nike

我需要修改与 RecyclerView 一起使用的垂直 LinearLayoutManager 以便它可以水平滚动。

当 RecyclerView 垂直滚动时,它会添加新项目,因为我正在扩展 LinearLayoutManager


我认为这会解决问题。

public class CustomLayoutManager extends LinearLayoutManager {


public TableLayoutManager(Context context) {
super(context);
}

@Override
public boolean canScrollHorizontally() {
return true;
}

@Override
public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {
int delta = -dx;

offsetChildrenHorizontal(delta);

return -delta;
}

}

现在,当我水平滚动 RecyclerView 时,它可以正常工作,但内容可以滚动到屏幕外。此外,当内容水平滚动然后垂直滚动时,RecycerView 将添加与左屏幕边框对齐的新 View ,而不是与初始 View 对齐。
演示行为的视频: http://youtu.be/FbuZ_jph7pw
我做错了什么?
更新(正如@yigit 所建议的)
现在我正在使用 LinearLayoutManager 的修改版本(我不再扩展它,因为我需要在私有(private)方法 fill(....)).
这些是我所做的更改:

    private int childrenLeftOffset = 0;
private int childrenMaxWith = 800; // I must update this value with children max width
@Override
public int scrollHorizontallyBy(int dx, RecyclerView.Recycler recycler, RecyclerView.State state) {

int delta = -dx;
int newOffset = childrenLeftOffset + delta;
if (newOffset < 0) {
if(newOffset < -childrenMaxWith) {
//right edge reached
offsetChildrenHorizontal(-(childrenMaxWith - Math.abs(childrenLeftOffset)));
childrenLeftOffset = -childrenMaxWith;
delta = 0; // RecyclerView will draw right edge effect.
} else {
//scroll horizontally
childrenLeftOffset = childrenLeftOffset + delta;
offsetChildrenHorizontal(delta);
}
} else {
//left edge reached
offsetChildrenHorizontal(Math.abs(childrenLeftOffset));
childrenLeftOffset = 0;
delta = 0; // RecyclerView will draw left edge effect.
}

return -delta;
}

private int fill(RecyclerView.Recycler recycler, RenderState renderState, RecyclerView.State state, boolean stopOnFocusable) {
........
........

left = left + myLeftOffset;
layoutDecorated(view, left + params.leftMargin, top + params.topMargin, right - params.rightMargin, bottom - params.bottomMargin);

.......
.......
}

滚动 CustomLinearLayout(更新视频)http://youtu.be/DHeXkvpgruo

现在的问题是获取RecyclerView children的最大宽度并更新childrenMaxWith。

最佳答案

LinearLayoutManager 确实支持在一个方向上滚动,所以当它需要布局一个新的 child 时,它只是从左边开始。offsetChildren 方法只是移动 child ,不保留任何信息。

您最好克隆 LinearLayoutManager 并覆盖 layoutChunk 方法。但每次发布新的 RV 版本时,您都需要这样做。

另一种可能的(快速且肮脏的)解决方案是:

  • 跟踪您的水平滚动位置
  • 覆盖 LayoutManager 中的 layoutDecorated 并根据水平滚动偏移偏移 leftright 值,然后调用 super.

这可能会起作用,但有可能破坏 LayoutManger 中的任何 future 更改。不过风险并不高,因为该方法非常核心。

关于android - 修改垂直 LinearLayoutManager 使其也可以水平滚动(包括视频),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28398197/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com