gpt4 book ai didi

android - 将水平 RecyclerView 作为项目放置在垂直 RecyclerView 中时的自动滚动问题

转载 作者:塔克拉玛干 更新时间:2023-11-02 20:14:54 26 4
gpt4 key购买 nike

为了重现这个问题,我克隆了一个 existing project并添加了两个 fragment 。所以现在有一个 Activity 和一个 ViewPager,它有 2 个 fragment 。每个 Fragment 都有一个 RecyclerView(垂直),其中包含多项 RecyclerView(水平)。

现在的问题是当中点水平 RecyclerView 留在顶部时,垂直 RecyclerView 在切换选项卡上自动滚动。

例如:

  1. 第一页滚动到这个位置

(注意第一个 H-Recycler View 被设置为只有一半可见)<​​/p>

  1. 然后点击 tablayout 上的 PAGE 2 转到第 2 页。

  2. 现在再次点击 tablayout 上的 PAGE 1 返回到第 1 页。这里预期的滚动位置是我们之前离开的位置,但它会自动滚动到顶部位置。像这样

(第一个 RecyclerView 是完全可见的,而不是一半。)


我在寻找解决方案时得到了一些线索。

  • 此问题出现在 v24.1.1 和 v24.2.1(撰写本文时最新版本)的库中,但当它降级到 v23.4.0 时,它会按预期工作。所以很明显,库中的某些内容被修改导致了这种行为。
  • 在包含 webview 的项目中遇到了同样的问题。 webView 和 H-recyclerView 之间的共同点是两者都可以在内部水平滚动。问题可能与滚动事件的消耗有关。

最佳答案

ViewPagerFragment 切换时,可以保存滚动状态。让您的 Activity 中有一个 static 变量,它将像这样存储滚动状态

public static int scrollPositionIndex;
public static int scrollPositionOffset;

现在从您的 Fragment 覆盖 setUserVisibleHint 函数。

@Override
public void setUserVisibleHint(boolean isVisibleToUser) {
super.setUserVisibleHint(isVisibleToUser);
// Make sure that we are currently visible
if (this.isVisible()) {
// If we are becoming invisible, then...
if (!isVisibleToUser) {

// Save scroll state
LinearLayoutManager layoutManager = ((LinearLayoutManager) mRecyclerView.getLayoutManager());
YourActivity.scrollPositionIndex = layoutManager.findFirstVisibleItemPosition();

View v = mRecyclerView.getChildAt(0);
YourActivity.scrollPositionOffset = (v == null) ? 0 : (v.getTop() - mRecyclerView.getPaddingTop());

} else {
// Scroll to the saved position
mLayoutManager.scrollToPositionWithOffset(YourActivity.scrollPositionIndex,
YourActivity.scrollPositionOffset);

// Reset the value
YourActivity.scrollPositionIndex = 0;
YourActivity.scrollPositionOffset = 0;
}
}
}

关于android - 将水平 RecyclerView 作为项目放置在垂直 RecyclerView 中时的自动滚动问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39768498/

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