CoordinatorLayout(CL)中的NestedScrollView(NSV):NSV在加载时不在顶部

我在CL中使用NSV,以便在NSV向下滚动时让工具栏压缩。 我遇到的问题是我的NSV在加载时没有滚动到顶部,相反,它从NSV的顶部偏移了相当大的余量(我不确定这个间距来自哪里,它不在布局)。

请看一下屏幕截图,第一个显示NSV如何加载,你可以清楚地看到NSV通过比较第二个(当我手动将NSV滚动到顶部时)从顶部向下滚动了很多:

When NSV loads, it's not at the top NSV scrolled to the top manually for comparison sake

我对此布局进行了一些更新,这导致了这种情况发生,之前,它在顶部加载而没有问题。 但是,我没有添加应该导致这种情况的任何间距。

这是我正在使用的布局:

          

任何想法,将不胜感激!

好! 经过一整天的调试我的布局和片段的每一个组件后,我确定了我认为的错误。

首先,问题是:在NSV的子视图中有元素会在运行时更改View.GONE的可见性,导致列表向下滚动。 我注意到列表滚动到切换可见性的元素上方(包括在视图上设置的任何边距)。

二,修复:我通过在xml布局中将所有视图设置为android:visibility =“gone”来修复此问题,然后,根据需要切换每个视图的可见性。 以前,默认情况下这些视图是可见的,然后我从那里开始工作。 我只需要改变我的逻辑,从他们开始全部,而不是非常困难。

我认为这是有效的,因为在onCreateView()中创建NSV时,您将在运行时隐藏的视图不会形成整体高度计算的一部分。 一旦片段进入onCreateView(),就可以安全地动态更改视图,但是,如果视图计算为onCreateView()中的高度部分,然后使用View.GONE隐藏,那么测量结果会很糟糕,最终会得到一个列表向下滚动显着。

您是否尝试在视图组中添加以下行,即在您的情况下添加FrameLayout

 android:descendantFocusability="blocksDescendants" 

我认为这对你也有用。

如果没有尝试添加NSV。

就我而言,我的滚动内容底部附近有一个EditText ,它正在抓住焦点。 由于NestedScrollView做了一些奇怪的布局,因此聚焦视图在活动开始时没有滚动到顶部,因此真正的原因并不明显。 将它添加到NestedScrollView的子布局中为我修复了它:

 android:focusableInTouchMode="true" 

你的post回答帮助我find了我的问题(顺便说一下,它是一样的)。 但我得到了它以不同的方式工作。 我想你正在使用RecyclerView 。 在我的情况下,我使用3个RecyclerViews 。 好吧,根据你的回答,我开始隐藏回收者,我发现其中只有一个导致了这个问题。 我做的是我填充了postDelayed:

 new Handler().postDelayed(new Runnable() { @Override public void run() { recyler.setLayoutManager(new LinearLayoutManager(getApplicationContext())); recyler.setAdapter(new MyAdapter(myList)); } }, 3000); 

这工作得很好!