web-dev-qa-db-ja.com

プログラムでNestedScrollViewの上部までスクロールします

親のスクロールイベントもトリガーすることで、プログラムでNestedScrollViewの一番上までスクロールする方法はありますか? smoothScrollTo(x, y)は、スクロールイベントをNestedScrollingParentに委任しません。

64
lukas1994

私はそれをなんとかしました(アニメーションスクロール):

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方向の速度です。

41
lukas1994
NestedScrollView.scrollTo(0, 0);
87
SilentKnight

スクロールNestedScrollViewを上下にスムーズにする別の方法は、fullScroll(direct)関数を使用することです

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

何もうまくいかず、なぜこれがうまくいったのか本当に分かりませんが、ここに私の解決策と問題があります。

ネストされたスクロールビューにリサイクラビューを追加すると、そのアクティビティに到達すると画面上にリサイクラビューが表示されました。一番上までスクロールするには、これを使用する必要がありました。

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);
20
Vulovic Vukasin

私も同様のシナリオに直面しました。私の場合、最後までスクロールするとFABボタンが表示され、ユーザーがそのFABボタンをタップするとページの上部に移動します。そのために、@ SilentKnight answer NestedScrollView.scrollTo(0, 0);を追加しました。トップに移動しますが、上にスクロールするためのスムーズなアニメーションには不十分です。
スムーズなアニメーションのために、NestedScrollView.fullScroll(View.FOCUS_UP);である@Sharjの回答を使用しましたが、AppBarが表示されないため、appBarLayout1.setExpanded(true)に従ってAppBarを拡張する必要があります。これら3つを使用すると、ページの上部にスムーズに移動できます。

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

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

スムーズなスクロールに使用できます。

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

通常のスクロールの場合

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.scrollTo(0,0);
8
Ali Akram

上記のすべての応答を試しましたが、nothinは機能しているように見えましたが、postDelayedだけが必要でした。

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

行を2回追加します。

nestedScrollView.fullScroll(View.FOCUS_UP);
nestedScrollView.fullScroll(View.FOCUS_UP);
2
Saljith Kj

代わりにView.scollTo(int x、int y)を使用して、上部にスクロールします。

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

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);
0
Maryam Azhdari