gpt4 book ai didi

android - scrollBy 在嵌套的 recyclerview 中不能正常工作

转载 作者:塔克拉玛干 更新时间:2023-11-02 07:47:11 30 4
gpt4 key购买 nike

我有一个垂直滚动的 RecyclerView 和水平滚动的内部 RecyclerView,就像这样。

expl

通过此实现,用户可以同步滚动每个水平回收 View 。但是,当用户垂直滚动到父 recyclerView 时,刚刚附加在窗口上的新水平 recyclerview 不会显示在相同的滚动 x 位置上。这个是正常的。因为它刚刚创建。

因此,我曾尝试滚动到滚动到显示之前的位置。就像这样:

注意:这是在垂直方向的父回收 View 的适配器中。

 @Override
public void onViewAttachedToWindow(RecyclerView.ViewHolder holder) {
super.onViewAttachedToWindow(holder);
CellColumnViewHolder viewHolder = (CellColumnViewHolder) holder;
if (m_nXPosition != 0) {
// this doesn't work properly
viewHolder.m_jRecyclerView.scrollBy(m_nXPosition, 0);
}
}

enter image description here

如您所见,scrollBy第 10 行第 11 行第 12 行 没有影响和 第 13 行 之后,我调试了代码以找出发生了什么。当我使用 scrollBy 设置滚动位置时,childCount() 为第 10 行第 11 行第 12 行第 13 行<返回零/strong> 所以他们不滚动。但为什么 ?为什么其他人工作?

  • 我该如何解决这个问题?
  • onViewAttachedToWindow 是滚动新附加 recyclervView 的正确位置吗?

注意:我也测试过scrollToPosition(),没有遇到这样的问题。但我不能在我的情况下使用它。因为用户可以滚动到可能不是确切位置的任何 x 位置。所以我需要使用 x 值而不是位置来设置滚动位置。

编辑:可以查看The source code

最佳答案

我找到了一个使用 scrollToPositionWithOffset 方法而不是使用 scrollBy 的解决方案。即使两者都滚动到另一个位置,它们在背面的工作过程也完全不同。

例如:如果您尝试使用 scrollBy 滚动任何像素位置,而您的 recyclerView 尚未设置任何适配器,这意味着没有任何数据可显示,因此它还没有任何项目, 然后 scrollBy 不起作用。 RecyclerView 使用其 layoutManager 的 scrollBy 方法。所以在我的例子中,我将 LinearLayoutManager 用于水平的 recyclerViews。

让我们看看它在做什么:

int scrollBy(int dy, RecyclerView.Recycler recycler, RecyclerView.State state) {
if (getChildCount() == 0 || dy == 0) {
return 0;
}
mLayoutState.mRecycle = true;
ensureLayoutState();
final int layoutDirection = dy > 0 ? LayoutState.LAYOUT_END : LayoutState.LAYOUT_START;
final int absDy = Math.abs(dy);
updateLayoutState(layoutDirection, absDy, true, state);
final int consumed = mLayoutState.mScrollingOffset
+ fill(recycler, mLayoutState, state, false);
if (consumed < 0) {
if (DEBUG) {
Log.d(TAG, "Don't have any more elements to scroll");
}
return 0;
}
final int scrolled = absDy > consumed ? layoutDirection * consumed : dy;
mOrientationHelper.offsetChildren(-scrolled);
if (DEBUG) {
Log.d(TAG, "scroll req: " + dy + " scrolled: " + scrolled);
}
mLayoutState.mLastScrollDelta = scrolled;
return scrolled;
}

如您所见,如果当时没有任何 child ,scrollBy 会忽略滚动 Intent 。

  if (getChildCount() == 0 || dy == 0) {
return 0;
}

另一方面,即使还没有任何设置数据,scrollToPosition 也可以完美地工作。

根据Pro RecyclerView slide ,下面的示例完美运行。但是你不能用 scrollBy 做到这一点。

void onCreate(SavedInstanceState state) {
....
mRecyclerView.scrollToPosition(selectedPosition);
mRecyclerView.setAdapter(myAdapter);
}

因此,我做了一些改动以使用scrollToPositionWithOffset()

在此实现之前,我将精确的滚动 x 位置计算为像素。

之后,当滚动条进入空闲状态时,计算第一个完整的可见位置到scrollToPositionWithOffset()的第一个参数。

对于第二个参数,即偏移量,我使用 view.getLeft() 函数获取值,这有助于获取此 View 相对于其父 View 的左侧位置。

enter image description here

而且效果很好!!

关于android - scrollBy 在嵌套的 recyclerview 中不能正常工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44819583/

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