프로그래밍 방식으로 NestedScrollView의 맨 위로 스크롤


82

NestedScrollView부모에 대한 스크롤 이벤트를 트리거하여 프로그래밍 방식으로 맨 위로 스크롤하는 방법이 있습니까? smoothScrollTo(x, y)스크롤 이벤트를 NestedScrollingParent.


질문을 더 명확히하세요. NestedScrollView가 코디네이터 레이아웃 내부에있을 때 말하려는 의미입니까?
Pier Betos

프로그래밍 방식으로 어느 지점 으로든 스크롤하려면 stackoverflow.com/questions/52083678/…을
user1506104

답변:



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

3
고마워. nestedscrollview의 맨 아래로 스크롤하는 방법에 대한 아이디어가 있습니까?
Bibu 2016-06-08

AppBarLayout가 확장되면 중첩 된 날뛰는을 시뮬레이션하는 것은 (좋은이다)이 축소되지만, 동시에 NestedScrollView 스크롤 아래로 ...하지 않습니다
라파엘 이어-Rivard

또한 AppBarLayout이 완전히 축소 된 경우 음의 y 속도 값을 사용하면 확장되지 않습니다.
Raphael Royer-Rivard

33

NestedScrollView위로 또는 아래로 완전히 부드럽게 스크롤 하는 또 다른 방법 은 fullScroll(direct)기능을 사용하는 것입니다.

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

fullScroll (View.FOCUS_UP) 숨겨진 앱 바가 나오지 않습니다. 모든 아이디어
의 Shabbir Dhangot

@Sabbir Dhangot 앱바 NestedScrollView아래에 배치 했 습니까?
MeLine

fullScroll이 뷰를 수신한다는 것을 알 수있는 질문이 하나 있습니다. 특정 textview, editext 또는 recyclerView로 스크롤하려면 스크롤합니까?
Felipe Franco

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 = "true"
user1025013

1
이 솔루션은 scrollView.scrollTo (0,0); 전혀 작동하지 않습니다.
taranjeetsapra

4
이것은 일 :scrollView.getParent().requestChildFocus(scrollView, scrollView);
라지브 Sahu

1
매력처럼 작동했습니다. 감사합니다
Vinoth은 IOS

21

저도 비슷한 시나리오에 직면했습니다. 필자의 경우 아래로 스크롤하여 끝까지 스크롤하면 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);

5
appBarLayout1.setExpanded (true); -나를 위해 일 했어! 감사합니다 :)
Andrei

감사합니다! 이 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

9

부드러운 스크롤을 위해 이것을 사용할 수 있습니다.

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

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.