如何检查 NestedScrollView 当前是否正在滚动?
How do I check if NestedScrollView is currently scrolling?
我有一个 NestedScrollView,我想查看它正在滚动的天气。
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {}
});
我上网查了一下,没找到解决方法。
为此,您必须编写扩展 NestedScrollView 的自定义视图,并在该视图中覆盖 onScrollChange() 方法并在该方法中添加日志以获取滚动值,您正在编写自定义视图因为您无法将日志添加到系统小部件。
选项 1(使用 ScrollChangeListener)
一个选项可能是在 scrollChangeListener
中存储和比较 scrollY
和 oldScrollY
值。像这样简单的东西可能会起作用(尽管还没有经过正式测试):
private boolean scrollHasBeenChecked = false;
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if(!scrollHasBeenChecked) {
scrollHasBeenChecked = true;
int scrollDif = scrollY - oldScrollY;
final Handler handler0 = new Handler(Looper.getMainLooper());
handler0.postDelayed(new Runnable() {
@Override
public void run() {
if(scrollDif == scrollY - oldScrollY) {
//Proceed
} else {
scrollHasBeenChecked = false;
}
}
//Adjust accordingly
}, 250);
}
}
});
选项 2(没有 ScrollChangeListener)
根据您的具体情况,您可以交叉检查 scrollY
值。在我的代码中,我需要在编程滚动到我的适配器 class 中的最后一个可见位置后使我的 recyclerView
可见,而不覆盖我的主 class 中的 scrollChangeListener
。如果我的 nestedScrollView.getScrollY() == lastVisiblePosition
(检查延迟可运行循环),则它不再滚动*。基于这个概念的通用解决方案可能会像这样工作:
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
int y = nestedScrollView.getScrollY();
checkIfStillScrolling(y);
}
//Pick an appropriate delay time or replace runnable with some equivalent checking mechanism
}, 1000);
private void checkIfStillScrolling(final int y) {
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(y = nestedScrollView.getScrollY()){
//Next step goes here
} else {
checkIfStillScrolling(y);
}
}
//Pick an appropriate loop delay time
}, 100);
}
*或多或少 - 必须考虑生命周期,但这与此无关
我有一个 NestedScrollView,我想查看它正在滚动的天气。
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {}
});
我上网查了一下,没找到解决方法。
为此,您必须编写扩展 NestedScrollView 的自定义视图,并在该视图中覆盖 onScrollChange() 方法并在该方法中添加日志以获取滚动值,您正在编写自定义视图因为您无法将日志添加到系统小部件。
选项 1(使用 ScrollChangeListener)
一个选项可能是在 scrollChangeListener
中存储和比较 scrollY
和 oldScrollY
值。像这样简单的东西可能会起作用(尽管还没有经过正式测试):
private boolean scrollHasBeenChecked = false;
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {
if(!scrollHasBeenChecked) {
scrollHasBeenChecked = true;
int scrollDif = scrollY - oldScrollY;
final Handler handler0 = new Handler(Looper.getMainLooper());
handler0.postDelayed(new Runnable() {
@Override
public void run() {
if(scrollDif == scrollY - oldScrollY) {
//Proceed
} else {
scrollHasBeenChecked = false;
}
}
//Adjust accordingly
}, 250);
}
}
});
选项 2(没有 ScrollChangeListener)
根据您的具体情况,您可以交叉检查 scrollY
值。在我的代码中,我需要在编程滚动到我的适配器 class 中的最后一个可见位置后使我的 recyclerView
可见,而不覆盖我的主 class 中的 scrollChangeListener
。如果我的 nestedScrollView.getScrollY() == lastVisiblePosition
(检查延迟可运行循环),则它不再滚动*。基于这个概念的通用解决方案可能会像这样工作:
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
int y = nestedScrollView.getScrollY();
checkIfStillScrolling(y);
}
//Pick an appropriate delay time or replace runnable with some equivalent checking mechanism
}, 1000);
private void checkIfStillScrolling(final int y) {
final Handler handler = new Handler(Looper.getMainLooper());
handler.postDelayed(new Runnable() {
@Override
public void run() {
if(y = nestedScrollView.getScrollY()){
//Next step goes here
} else {
checkIfStillScrolling(y);
}
}
//Pick an appropriate loop delay time
}, 100);
}
*或多或少 - 必须考虑生命周期,但这与此无关