スクロールのネストされた位置を検出したいだけですscrollview Android下部にあり、関数を呼び出すために。私のコードは:
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と同じではありません。修正方法
setOnScrollChangeListener
paramsに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");
}
}
});
}
私はそれが遅いことを知っていますが..この方法を試してください。
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");
}
}
}
それは私のために働いた、 ソース
api <23の場合、ローカルのfloat変数を格納する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");
}
}