以编程方式滚动到 NestedScrollView 的顶部
Programmatically scroll to the top of a NestedScrollView
有没有办法通过同时触发父项的滚动事件以编程方式滚动到 NestedScrollView
的顶部? smoothScrollTo(x, y)
不会将滚动事件委托给 NestedScrollingParent
。
我做到了(动画滚动):
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 方向的速度。
NestedScrollView.scrollTo(0, 0);
您可以轻松地在 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
一直向上或向下的方法是使用 fullScroll(direct)
函数
nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);
对我来说没有任何效果,我真的不知道为什么会这样,但这是我的解决方案和问题。
将回收视图添加到嵌套滚动视图时,到达该视图时会在屏幕上显示回收视图 activity。为了一直向上滚动,我不得不使用这个:
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);
使用 View.scollTo(int x, int y) 滚动到顶部。
findViewById({your NestedScrollView resource id}).scrollTo(0, 0);
我也遇到过类似的情况。在我的例子中,当我向下滚动到结束时,应该会出现 FAB 按钮,当用户点击该 FAB 按钮时,应该会转到页面顶部。
为此,我添加了@SilentKnight answer NestedScrollView.scrollTo(0, 0);
For go to the top but which is not enough to smooth animation for scroll up.
对于流畅的动画,我使用了@Sharj 的答案,即 NestedScrollView.fullScroll(View.FOCUS_UP);
但是我的 AppBar 在那里不可见,因此我必须按以下方式扩展 AppBar appBarLayout1.setExpanded(true)
。
所以使用这三个我可以顺利地转到页面顶部。
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
appBarLayout1.setExpanded(true);
您可以使用它来平滑滚动。
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.smoothScrollTo(0,0);
或正常滚动
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
我尝试了以上所有回复,似乎没有任何效果,但我只需要一个 postDelayed。
scrollview.postDelayed(new Runnable() {
@Override
public void run() {
listener.setAppBarExpanded(false, true); //appbar.setExpanded(expanded, animated);
scrollview.fullScroll(View.FOCUS_DOWN);
}
}, 400);
与 RecyclerView 相比,我在使用 NestedScrollView 时遇到了问题。
这段代码对我有用:
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);
添加该行两次。对我有用
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
这是当 RecyclerView 在 NestedScrollView 中时我如何滚动到 RecyclerView 的项目
首先,获取 item height
,然后滚动到您想要的 position
。
val itemHeight =
binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
有时 NestedScrollView.scrollTo(0, 0);
和 scrollview.pageScroll(View.FOCUS_UP);
不起作用
那你需要同时使用fling()
和smoothScrollTo()
示例代码
nestedScrollView.post {
nestedScrollView.fling(0)
nestedScrollView.smoothScrollTo(0, 0)
}
有没有办法通过同时触发父项的滚动事件以编程方式滚动到 NestedScrollView
的顶部? smoothScrollTo(x, y)
不会将滚动事件委托给 NestedScrollingParent
。
我做到了(动画滚动):
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 方向的速度。
NestedScrollView.scrollTo(0, 0);
您可以轻松地在 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
一直向上或向下的方法是使用 fullScroll(direct)
函数
nestedScrollView.fullScroll(View.FOCUS_DOWN);
nestedScrollView.fullScroll(View.FOCUS_UP);
对我来说没有任何效果,我真的不知道为什么会这样,但这是我的解决方案和问题。
将回收视图添加到嵌套滚动视图时,到达该视图时会在屏幕上显示回收视图 activity。为了一直向上滚动,我不得不使用这个:
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);
使用 View.scollTo(int x, int y) 滚动到顶部。
findViewById({your NestedScrollView resource id}).scrollTo(0, 0);
我也遇到过类似的情况。在我的例子中,当我向下滚动到结束时,应该会出现 FAB 按钮,当用户点击该 FAB 按钮时,应该会转到页面顶部。
为此,我添加了@SilentKnight answer NestedScrollView.scrollTo(0, 0);
For go to the top but which is not enough to smooth animation for scroll up.
对于流畅的动画,我使用了@Sharj 的答案,即 NestedScrollView.fullScroll(View.FOCUS_UP);
但是我的 AppBar 在那里不可见,因此我必须按以下方式扩展 AppBar appBarLayout1.setExpanded(true)
。
所以使用这三个我可以顺利地转到页面顶部。
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
appBarLayout1.setExpanded(true);
您可以使用它来平滑滚动。
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.smoothScrollTo(0,0);
或正常滚动
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
我尝试了以上所有回复,似乎没有任何效果,但我只需要一个 postDelayed。
scrollview.postDelayed(new Runnable() {
@Override
public void run() {
listener.setAppBarExpanded(false, true); //appbar.setExpanded(expanded, animated);
scrollview.fullScroll(View.FOCUS_DOWN);
}
}, 400);
与 RecyclerView 相比,我在使用 NestedScrollView 时遇到了问题。 这段代码对我有用: 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);
添加该行两次。对我有用
nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
这是当 RecyclerView 在 NestedScrollView 中时我如何滚动到 RecyclerView 的项目
首先,获取 item height
,然后滚动到您想要的 position
。
val itemHeight =
binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
有时 NestedScrollView.scrollTo(0, 0);
和 scrollview.pageScroll(View.FOCUS_UP);
不起作用
那你需要同时使用fling()
和smoothScrollTo()
示例代码
nestedScrollView.post {
nestedScrollView.fling(0)
nestedScrollView.smoothScrollTo(0, 0)
}