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


82

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


質問をさらに明確にします。NestedScrollViewがコーディネーターレイアウト内にある場合を言いますか?
Pier Betos 2016年

プログラムで任意のポイントにスクロールするには、stackoverflow.com
questions / 52083678 /を

回答:


106
NestedScrollView.scrollTo(0, 0);

7
NestedScrollView.scrollTo(0, 0);の一番上までスクロールするために使用するように言っていますNestedScrollView。どういたしまして。
SilentKnight 2015

これは、より一般的にScrollViewまたはNestedScrollViewの両方に適用されます。
ロバート

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

ここ10000で、はy方向の速度です。


1
私の場合のようにスクロールしてappbarlayoutを非表示にするだけの場合はbehavior.onNestedFling(coordinator, appbar, null, 0, -params.height, true);、逆にすることができますbehavior.onNestedFling(coordinator, appbar, null, 0, params.height, true);
k0sh 2016

3
THX。ネストされたスクロールビューの一番下までスクロールする方法について何かアイデアはありますか?
ビブ2016年

AppBarLayoutが展開されている場合は、ネストされた情事をシミュレートすることは(素晴らしいです)、それを崩壊するが、同時にNestedScrollViewスクロールダウン...することはありません
ラファエルロイヤー-Rivard

さらに、AppBarLayoutが完全に折りたたまれている場合、負のy速度値を使用しても展開されません。
Raphael Royer-Rivard 2016年

33

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

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

fullScroll(View.FOCUS_UP)非表示のappbarが出てこない。任意のアイデア
Shabbir Dhangot 2017年

@Sabbir DhangotはNestedScrollView、アプリバーの下にレイアウトしましたか?
MeLine 2018

fullScrollがビューを受け取ることがわかる質問が1つあります。特定の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
うわー、これは最高です、damet Garm
abbasalim 2017

11
ネストされたスクロールビュー内のrecyclerviewがアクティビティに入るときにすでに途中までスクロールされているという問題がある場合は、XMLのルートの下にある最上位の要素を次のプロパティに設定してみてくださいandroid:
focusableInTouchMode

1
このソリューションは、scrollView.scrollTo(0,0);として完全に機能します。 まったく機能しません。
taranjeetsapra

4
これはうまくscrollView.getParent().requestChildFocus(scrollView, scrollView);
いきました

1
チャームのように働いた。ありがとう
Vinoth ios 2018

21

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

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 2018

9

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

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

または通常のスクロールの場合

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

Gr8ジョブ。あなたは私の時間を節約します
PriyankaG19年

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

2

行を2回追加します。

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

1

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

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

0

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

RecyclerViewがNestedScrollView内にあるときにRecyclerViewのアイテムにスクロールする方法は次のとおりです

まず、取得してから、目的の場所item heightまでスクロールしpositionます。

val itemHeight =
    binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.