Cuộn theo chương trình lên đầu NestedScrollView


81

Có cách nào để cuộn lên đầu trang theo cách lập trình NestedScrollViewbằng cách cũng kích hoạt các sự kiện cuộn cho phụ huynh không? smoothScrollTo(x, y)không ủy quyền các sự kiện cuộn cho NestedScrollingParent.


Làm rõ câu hỏi của bạn hơn, bạn muốn nói khi nào NestedScrollView nằm bên trong bố cục điều phối viên?
Pier Betos

để cuộn theo chương trình đến bất kỳ điểm nào, hãy kiểm tra stackoverflow.com/questions/52083678/…
user1506104

Câu trả lời:


105
NestedScrollView.scrollTo(0, 0);

7
Tôi đang bảo bạn sử dụng NestedScrollView.scrollTo(0, 0);để cuộn lên đầu NestedScrollView. Không có gì.
SilentKnight

Điều này thường được áp dụng cho cả ScrollView hoặc NestedScrollView.
Robert

42

Tôi đã quản lý để làm điều đó (cuộn động):

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

nơi 10000là vận tốc trong y-hướng.


1
nếu bạn chỉ thích cuộn để ẩn appbarlayout như trong trường hợp của tôi bạn có thể làm behavior.onNestedFling(coordinator, appbar, null, 0, -params.height, true);để đảo ngược nóbehavior.onNestedFling(coordinator, appbar, null, 0, params.height, true);
k0sh

3
Cám ơn. Bất kỳ ý tưởng nào về cách cuộn xuống cuối màn hình lồng nhau?
Bibu

Khi AppBarLayout được mở rộng, mô phỏng fling lồng nhau sẽ sụp đổ nó (đó là rất tốt), nhưng sẽ không làm cho NestedScrollView cuộn xuống cùng một lúc ...
Raphael Royer-Rivard

Ngoài ra, khi AppBarLayout được thu gọn hoàn toàn, việc sử dụng giá trị vận tốc y âm sẽ không mở rộng nó.
Raphael Royer-Rivard

33

Một cách khác để cuộn mượt NestedScrollViewmà lên hoặc xuống là sử dụng fullScroll(direct)hàm

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

fullScroll (View.FOCUS_UP) thanh ứng dụng ẩn không xuất hiện. Bất cứ ý tưởng
Shabbir Dhangot

@Sabbir Dhangot bạn đã bố trí NestedScrollViewbên dưới thanh ứng dụng chưa?
MeLine

Tôi có một câu hỏi mà tôi có thể thấy rằng fullScroll nhận được một lượt xem. nếu tôi muốn cuộn đến một textview, editext, hoặc RecyclerView nào đó thì nó sẽ cuộn đến nó chứ?
Felipe Franco

22

Không có gì hiệu quả với tôi và tôi thực sự không biết tại sao điều này lại hiệu quả, nhưng đây là giải pháp và vấn đề của tôi.

Khi thêm chế độ xem người tái chế vào chế độ xem cuộn lồng nhau, nó sẽ hiển thị chế độ xem người tái chế trên màn hình khi đến hoạt động đó. Để cuộn lên hết cỡ, tôi phải sử dụng cái này:

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, đây là điều tốt nhất, damet Garm
abbasalim

11
Nếu vấn đề của bất kỳ ai là chế độ xem tái chế bên trong chế độ xem cuộn lồng nhau đã được cuộn một nửa khi vào hoạt động, hãy thử đặt phần tử trên cùng dưới gốc của XML để có thuộc tính sau android: focusableInTouchMode = "true"
user1025013

1
Giải pháp này hoạt động hoàn hảo khi scrollView.scrollTo (0,0); không hoạt động ở tất cả.
taranjeetsapra

4
Điều này đã hoạt động:scrollView.getParent().requestChildFocus(scrollView, scrollView);
Rajeev Sahu

1
Làm việc như người ở. Cảm ơn
Vinoth ios

21

Tôi cũng phải đối mặt với tình huống tương tự. Trong trường hợp của tôi, khi tôi cuộn xuống để kết thúc, nút FAB sẽ xuất hiện và khi người dùng nhấn vào nút FAB đó sẽ lên đầu trang. Đối với điều đó, tôi đã thêm câu trả lời @SilentKnight NestedScrollView.scrollTo(0, 0);Cho lên trên cùng nhưng không đủ để có hoạt ảnh mượt mà khi cuộn lên.
Để có hoạt ảnh mượt mà, tôi đã sử dụng câu trả lời @Sharj đó là NestedScrollView.fullScroll(View.FOCUS_UP); Nhưng sau đó AppBar của tôi không hiển thị ở đó nên tôi phải mở rộng AppBar như sau appBarLayout1.setExpanded(true). Vì vậy, sử dụng ba cái này, tôi có thể lên đầu trang một cách suôn sẻ.

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

5
appBarLayout1.setExpanded (true); - đã làm cho tôi! Cảm ơn :)
Andrei

Cảm ơn bạn! Đây là câu trả lời đúng nhất, đặc biệt là khi sử dụng appbarlayout
demogorgorn

11

Bạn có thể dễ dàng giả mạo thao tác cuộn ở cấp NestedScrollView. Về cơ bản, bạn nói với điều phối viênLayout rằng bạn vừa cuộn theo chiều cao của thanh công cụ.

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

Câu trả lời duy nhất phù hợp với tôi! Tôi cần cuộn lên trong bố cục của bộ điều phối (vì vậy cả hai dạng nestedScrollView và sập xuống). Tôi đã sử dụng mã hiện có nhưng toolbarHeight đã thay đổi thành Integer.MIN_VALUE và -toolbarHeight thành Integer.MAX_VALUE (vì tôi cần điều chỉnh ngược lại). Và sau đó tôi gọi appBarLayout.setExpanded (true, true); Cảm ơn bạn!
Viktoriia Chebotar

9

Bạn có thể sử dụng điều này để cuộn mượt mà.

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

HOẶC cho cuộn bình thường

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

Gr8 công việc. Giúp bạn tiết kiệm thời gian của tôi
Priyanka G

7

Tôi đã thử tất cả các phản hồi ở trên, dường như không có gì hoạt động nhưng tôi chỉ cần một bài đăng Bị hoãn.

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

6

Một thời gian NestedScrollView.scrollTo(0, 0);scrollview.pageScroll(View.FOCUS_UP);không hoạt động

Tại đó bạn cần sử dụng fling()smoothScrollTo()cùng nhau

MÃ MẪU

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

2

Thêm dòng hai lần. Làm việc cho tôi

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

1

Thay vào đó, hãy sử dụng View.scollTo (int x, int y) để cuộn lên trên cùng.

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

0

Tôi đã gặp sự cố với NestedScrollView khi sử dụng hơn là với RecyclerView. Mã này phù hợp với tôi: 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

Đây là cách tôi cuộn đến một mục của RecyclerView khi RecyclerView ở bên trong NestedScrollView

Đầu tiên, lấy một dấu item heightrồi cuộn đến cái positionmà bạn muốn.

val itemHeight =
    binding.calendarRecyclerView.findViewHolderForAdapterPosition(0)!!.itemView.height
binding.nestedScrollView2.smoothScrollTo(0, position * itemHeight)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.