我只是想在底部检测滚动nestedscrollview android的位置,以及to call函数。 我的代码是:
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不同。怎么解决?
答案 0 :(得分:76)
在setOnScrollChangeListener
参数中设置NestedScrollView
以获取
要检测偏移是否在底部,有必要获取内容高度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");
}
}
});
}
答案 1 :(得分:12)
我知道现在已经很晚了但是试试这个。
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");
}
}
});
快乐编码..
答案 2 :(得分:1)
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
}
答案 3 :(得分:0)
@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");
}
}
}
它为我工作,Source
答案 4 :(得分:0)
对于api <23,您可以添加一个treeObserver.scrollChangeLister存储本地float变量,并检查滚动的方式
示例
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");
}
}
答案 5 :(得分:0)
Webserve回答正确,但是条件应该是这样
if (scrollY == (v?.getChildAt(0)?.measuredHeight ?: 0) - (v?.measuredHeight ?: 0)) {
//at bottom
}
答案 6 :(得分:0)
这对我有用:
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()))
这只能工作一段时间...因此,请勿以这种方式使用。
答案 7 :(得分:0)
这对我有用!
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 ");
}
}
});