问题
i just want to detect the position of the scroll nestedscrollview android at the bottom, and the to call function. my code is :
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");
}
}
});
but totalheight not same wit MAX ScrollY. how to fix it ?
回答1:
Set setOnScrollChangeListener
in a NestedScrollView
params to get
- NestedScrollView v (parent with scroll)
- int scrollY
- int oldScrollY
To detect whether the offset is at the bottom, it is necessary to obtain the value of content height v.getChildAt(0).getMeasuredHeight()
and compare the current scroll over the height of the parent, if you have the same value , it means that it has reached the end.
You can get the height with parent view with 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");
}
}
});
}
回答2:
I know it's late but.. try this way.
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");
}
}
});
Happy Coding..
回答3:
Webserveis answered right, but it needs a little bit of changes in onScrollChange (override method), like this:
if (scrollY === v.getChildAt(0).getMeasuredHeight() - v.getMeasuredHeight()) {
// end of the scroll view
}
Kotlin:
if (scrollY == v.getChildAt(0).measuredHeight - v.measuredHeight) {
// end of the scroll view
}
回答4:
@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");
}
}
}
Its worked for me, Source
回答5:
for api <23 you can add a treeObserver.scrollChangeLister store a local float variable and check which way your scrolling like this
example
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");
}
}
来源:https://stackoverflow.com/questions/36143802/how-to-detect-the-position-of-the-scroll-nestedscrollview-android-at-the-bottom