[英]Android: How to detect when NestedScrollView scrolled to the bottom
[英]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
以獲取
要檢測偏移量是否在底部,需要獲取內容高度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.