以编程方式滚动到NestedScrollView的顶部


80

是否可以NestedScrollView通过触发父级的滚动事件来以编程方式滚动到a的顶部?smoothScrollTo(x, y)不会将滚动事件委托给NestedScrollingParent


进一步澄清您的问题,您是要说NestedScrollView在协调器布局内部时的情况吗?
Pier Betos

以编程方式滚动到任意时间点,检查stackoverflow.com/questions/52083678/...
user1506104

Answers:



42

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

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);
}

10000y方向的速度在哪里。


1
如果您只想像我一样滚动以隐藏appbarlayout,则可以将behavior.onNestedFling(coordinator, appbar, null, 0, -params.height, true);其反转behavior.onNestedFling(coordinator, appbar, null, 0, params.height, true);
k0sh 2016年

3
谢谢。关于如何滚动到nestedscrollview底部的任何想法?
Bibu

当AppBarLayout展开时,模拟嵌套的fling将使其折叠(很棒),但不会使NestedScrollView同时向下滚动...
Raphael Royer-Rivard

另外,当AppBarLayout完全折叠时,使用负y速度值将不会对其进行扩展。
拉斐尔·罗耶·里瓦尔德

33

向上滚动NestedScrollView或向下滚动到另一端的另一种方法是使用fullScroll(direct)function

nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);

fullScroll(View.FOCUS_UP)隐藏的应用栏没有出来。任何想法
Shabbir Dhangot

@Sabbir Dhangot您是否在应用栏NestedScrollView下方布置了布局?
MeLine '18

我有一个问题,我可以看到fullScroll收到了一个视图。如果我想滚动到某个textview,editext或recyclerView,它将滚动到它吗?
菲利佩·佛朗哥

22

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

将回收者视图添加到嵌套滚动视图时,进入​​该活动时它会在屏幕上显示回收者视图。为了向上滚动,我必须使用以下代码:

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);

5
Wooooow,这是最好的,Damet Garm
abbasalim

11
如果有人的问题是进入活动时嵌套滚动视图中的recyclerview已滚动一半,请尝试将XML根目录下的最顶层元素设置为具有以下属性android:
focusableInTouchMode

1
该解决方案在scrollView.scrollTo(0,0)的地方完美工作 根本不起作用。
taranjeetsapra

4
这起作用了:scrollView.getParent().requestChildFocus(scrollView, scrollView);
拉杰夫·萨胡

1
像魅力一样工作。谢谢
Vinoth ios

21

我也面临类似的情况。就我而言,当我向下滚动至末尾时,应显示FAB按钮,而当用户点击该FAB按钮时,应转到页面顶部。为此,我添加了@SilentKnight答案NestedScrollView.scrollTo(0, 0);转到顶部,但这不足以使平滑动画向上滚动。
为了使动画流畅,我使用了@Sharj答案,NestedScrollView.fullScroll(View.FOCUS_UP); 但是我的AppBar在那里不可见,因此我必须如下扩展AppBar appBarLayout1.setExpanded(true)。因此,使用这三个我可以顺利地转到页面顶部。

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
appBarLayout1.setExpanded(true);

5
appBarLayout1.setExpanded(true); -为我工作!谢谢:)
安德烈

谢谢!这是最正确的答案,尤其是在使用appbarlayout时
demogorgorn

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());

对我有用的唯一答案!我需要向上滚动协调器布局(所以nestedScrollView和collapsibleToolbar都可以)。我使用了现有代码,但toolbarHeight更改为Integer.MIN_VALUE,-toolbarHeight更改为Integer.MAX_VALUE(因为我需要相反的方向)。然后我调用appBarLayout.setExpanded(true,true); 谢谢!
维克托里亚·谢伯塔尔(Viktoriia Chebotar)

8

您可以使用它进行平滑滚动。

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

或正常滚动

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

Gr8工作。您节省了我的时间
Priyanka G

7

我尝试了上述所有响应,但似乎没什么用,但我只需要一个postDelayed。

    scrollview.postDelayed(new Runnable() {
        @Override
        public void run() {
            listener.setAppBarExpanded(false, true); //appbar.setExpanded(expanded, animated);
            scrollview.fullScroll(View.FOCUS_DOWN);
        }
    }, 400);

6

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

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

样本代码

nestedScrollView.post {
   nestedScrollView.fling(0)
   nestedScrollView.smoothScrollTo(0, 0)
}


1

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

findViewById({your NestedScrollView resource id}).scrollTo(0, 0);

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);

0

这是当RecyclerView位于NestedScrollView内时如何滚动到RecyclerView的项目的方法

首先,获得,item height然后滚动到所需的position

val itemHeight =
    binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.