89

NestedScrollView有没有办法通过触发父级的滚动事件以编程方式滚动到 a 的顶部?smoothScrollTo(x, y)不会将滚动事件委托给NestedScrollingParent.

4

13 回答 13

117
NestedScrollView.scrollTo(0, 0);
于 2015-07-10T05:46:18.763 回答
44

我设法做到了(动画滚动):

CoordinatorLayout.LayoutParams params = (CoordinatorLayout.LayoutParams) appBarLayout.getLayoutParams();
AppBarLayout.Behavior behavior = (AppBarLayout.Behavior) params.getBehavior();
if (behavior != null) {
    behavior.onNestedFling(coordinatorLayout, appBarLayout, null, 0, 10000, true);
}

其中10000是 y 方向的速度。

于 2015-07-04T06:58:42.550 回答
35

另一种平滑滚动NestedScrollView到向上或向下的方法是使用fullScroll(direct)函数

nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);
于 2016-07-13T20:56:51.230 回答
23

没有什么对我有用,我真的不知道为什么会这样,但这是我的解决方案和问题。

将回收器视图添加到嵌套滚动视图时,当进入该活动时,它会在屏幕上显示回收器视图。为了一直向上滚动,我不得不使用这个:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.details_recycler_view);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setItemAnimator(new DefaultItemAnimator());
ProductDescriptionAdapter adapter = new ProductDescriptionAdapter(this);
adapter.setData(mProduct.getDetails());
recyclerView.setAdapter(adapter);
NestedScrollView scrollView = (NestedScrollView) findViewById(R.id.scroll);
scrollView.getParent().requestChildFocus(scrollView, scrollView);
于 2016-09-03T09:55:38.040 回答
22

我也遇到过类似的情况。在我的情况下,当我向下滚动到结尾时,应该会出现 FAB 按钮,并且当用户点击该 FAB 按钮时,应该会转到页面顶部。为此,我添加了@SilentKnight 回答NestedScrollView.scrollTo(0, 0);For go to the top,但这对于向上滚动的平滑动画来说是不够的。
对于流畅的动画,我使用了@Sharj 的答案,NestedScrollView.fullScroll(View.FOCUS_UP); 但是我的 AppBar 在那里不可见,因此我必须将 AppBar 扩展如下appBarLayout1.setExpanded(true)。所以使用这三个我可以顺利进入页面顶部。

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
appBarLayout1.setExpanded(true);
于 2018-03-23T05:30:13.827 回答
12

您可以使用它来平滑滚动。

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.smoothScrollTo(0,0);

或正常滚动

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
于 2018-07-23T06:53:37.453 回答
12

一些时间NestedScrollView.scrollTo(0, 0);,并scrollview.pageScroll(View.FOCUS_UP);不起作用

在那你需要使用 fling()smoothScrollTo()一起

示例代码

nestedScrollView.post {
   nestedScrollView.fling(0)
   nestedScrollView.smoothScrollTo(0, 0)
}
于 2019-12-14T07:36:28.093 回答
11

您可以轻松伪造 NestedScrollView 级别的滚动。您基本上告诉 coordinatorLayout 您刚刚滚动了工具栏的高度。

    NestedScrollView nestedScrollView = (NestedScrollView) getActivity().findViewById(R.id.your_nested_scroll_view);

    int toolbarHeight = getActivity().findViewById(R.id.toolbar).getHeight();

    nestedScrollView.startNestedScroll(ViewCompat.SCROLL_AXIS_VERTICAL);
    nestedScrollView.dispatchNestedPreScroll(0, toolbarHeight, null, null);
    nestedScrollView.dispatchNestedScroll(0, 0, 0, 0, new int[]{0, -toolbarHeight});
    nestedScrollView.scrollTo(0, nestedScrollView.getBottom());
于 2016-01-21T09:58:54.217 回答
7

我尝试了上述所有响应,似乎没有任何效果,但我只需要一个 postDelayed。

    scrollview.postDelayed(new Runnable() {
        @Override
        public void run() {
            listener.setAppBarExpanded(false, true); //appbar.setExpanded(expanded, animated);
            scrollview.fullScroll(View.FOCUS_DOWN);
        }
    }, 400);
于 2018-09-26T10:38:15.523 回答
4

添加该行两次。为我工作

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
于 2019-04-10T06:54:38.950 回答
1

改为使用 View.scollTo(int x, int y) 滚动到顶部。

findViewById({your NestedScrollView resource id}).scrollTo(0, 0);
于 2018-02-09T11:05:19.093 回答
0

当我使用 NestedScrollView 时,我遇到了问题,而不是 RecyclerView 。这段代码对我有用: nestedScrollView!!.getParent().requestChildFocus(nestedScrollView,nestedScrollView);

    val recyclerViewSearch = activity?.findViewById<RecyclerView>(R.id.recycler)
    recyclerViewSearch.setAdapter(setAdapterSearch())

    val nestedScrollView = activity?.findViewById<NestedScrollView>(R.id.bottom_sheet_Search)
    nestedScrollView!!.getParent().requestChildFocus(nestedScrollView, nestedScrollView);
于 2018-12-09T21:07:15.970 回答
0

当 RecyclerView 在 NestedScrollView 内时,这是我如何滚动到 RecyclerView 的一项

首先,获取item height然后滚动到position您想要的。

val itemHeight =
    binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
于 2019-12-03T09:51:06.387 回答