簡體   English   中英

如何檢測底部滾動嵌套滾動視圖android的position?

[英]how to detect the position of the scroll nestedscrollview android at the bottom?

我只想檢測底部滾動 nestedscrollview android 的 position,然后調用 function。我的代碼是:

scroll.getViewTreeObserver()
      .addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
           @Override
           public void onScrollChanged() {
               int totalHeight = scroll.getChildAt(0).getHeight();
               int scrollY = scroll.getScrollY();
               Log.v("position", "totalHeight=" + totalHeight + "scrollY=" + scrollY);
               if (scrollY==totalHeight) {
                   getPlaylistFromServer("more");
               }
           }
      });

但總高度與 MAX ScrollY 不同。 如何解決?

NestedScrollView參數中設置setOnScrollChangeListener以獲取

  • NestedScrollView v(帶滾動的父級)
  • 滾動條
  • int oldScrollY

要檢測偏移量是否在底部,需要獲取內容高度v.getChildAt(0).getMeasuredHeight()並比較當前滾動超過父級的高度,如果有相同的值,則意味着它已經到了盡頭。

您可以使用v.getMeasuredHeight()獲取父視圖的高度

NestedScrollView scroller = (NestedScrollView) findViewById(R.id.myScroll);

if (scroller != null) {

    scroller.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

            if (scrollY > oldScrollY) {
                Log.i(TAG, "Scroll DOWN");
            }
            if (scrollY < oldScrollY) {
                Log.i(TAG, "Scroll UP");
            }

            if (scrollY == 0) {
                Log.i(TAG, "TOP SCROLL");
            }

           if (scrollY == ( v.getMeasuredHeight() - v.getChildAt(0).getMeasuredHeight() )) {
               Log.i(TAG, "BOTTOM SCROLL");
           }
       }
    });
}

我知道已經晚了但是..試試這個。

scroll.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
    @Override
    public void onScrollChanged() {
            View view = (View) scroll.getChildAt(scroll.getChildCount() - 1);

            int diff = (view.getBottom() - (scroll.getHeight() + scroll
                    .getScrollY()));

            if (diff == 0) {
                getPlaylistFromServer("more");
            }          
    }
});

快樂編碼..

Webserve 的回答是正確的,但它需要在 onScrollChange(覆蓋方法)中進行一些更改,如下所示:

if (scrollY === v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()) {
   // end of the scroll view
}

科特林:

if (scrollY == v.getChildAt(0).measuredHeight - v.measuredHeight) {
    // end of the scroll view
}
  @Override
public void onScrollChange(NestedScrollView nestedScrollView, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
    if (nestedScrollView.getChildAt(nestedScrollView.getChildCount() - 1) != null) {
        if ((scrollY >= (nestedScrollView.getChildAt(nestedScrollView.getChildCount() - 1).getMeasuredHeight() - nestedScrollView.getMeasuredHeight())) &&
                scrollY > oldScrollY) {
            LogsUtils.INSTANCE.makeLogD(">onScrollChange>", ">>BOTTOm");
        }

    }
}

它對我有用, 來源

這對我有用:

nestedScroll.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
        @Override
        public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {

            if (v.getChildAt(0).getBottom()<=(nestedScroll.getHeight()+scrollY)) {
                System.out.println("End of NestedScrollView");
            }

        }
    });

基本上,我們在一個nestedScrollView 中添加了許多視圖,但是以單一視圖的形式將它們包裝在一起。 因此,childCount 將始終為 1,其索引為 0。因此,使用v.getChildAt(0).getBottom()來確定其底部。 現在, nestedScroll.getHeight()以像素為單位返回高度,而scrollY將返回當前的垂直原點。 因此,每次到達 NestedScrollView 的底部時,上述條件都會成立。

if (v.getChildAt(0).getBottom()==(nestedScroll.getHeight()+nestedScroll.getScrollY()))

這只會在一段時間內起作用......因此,不要以這種方式使用它。

對於 api <23,您可以添加一個 treeObserver.scrollChangeLister 存儲本地浮點變量並檢查您的滾動方式

例子

public class About extends AppCompatActivity implements 
ViewTreeObserver.OnScrollChangedListener{

private float viewScrolled = 0;

   nestedScrollView.getViewTreeObserver().addOnScrollChangedListener(this);

}

@Override
public void onScrollChanged() {

    if (viewScrolled < nestedScrollView.getScrollY()){
        viewScrolled = nestedScrollView.getScrollY();
        Log.d(TAG, "scrolling up");
    }
    if (viewScrolled > nestedScrollView.getScrollY()){
        viewScrolled = nestedScrollView.getScrollY();
        Log.d(TAG, "scrolling down");
    }
}

webserve回答對了,但是條件應該是這樣的

 if (scrollY == (v?.getChildAt(0)?.measuredHeight ?: 0) - (v?.measuredHeight ?: 0)) {
    //at bottom
    }

這對我有用!

            my_scroll_view.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
            @Override
            public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {



                    if (scrollY == v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()) {
                        Log.d(TAG, "onScrollChange: SRCOLLED ==> scrollY: ======================================> THIS IS THE VERY END ");
                    }

                

            }
        });

我只是更改了第一個答案的一些代碼,以檢測嵌套滾動視圖中到達 recyclerview 的結尾。

binding.nestedScroll.setOnScrollChangeListener(object:NestedScrollView.OnScrollChangeListener {
        override fun onScrollChange(
            v: NestedScrollView,
            scrollX: Int,
            scrollY: Int,
            oldScrollX: Int,
            oldScrollY: Int
        ) {

        if (scrollY > oldScrollY) {
            Log.i("TAG", "Scroll DOWN");
        }
        if (scrollY < oldScrollY) {
            Log.i("TAG", "Scroll UP");
        }

        if (scrollY == 0) {
            Log.i("TAG", "TOP SCROLL");
        }
       
        if (v.getChildAt(0).getBottom() <= v.height + scrollY)
            {
            Log.i("TAG", "BOTTOM SCROLL IN Recyclerview.");

            Toast.makeText(requireContext(), "Last", Toast.LENGTH_LONG).show()
        }

        }
    })

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM