我有一个NestedScrollView,我想看看它现在正在滚动的天气。
nestedScrollView.setOnScrollChangeListener(new NestedScrollView.OnScrollChangeListener() {
@Override
public void onScrollChange(NestedScrollView v, int scrollX, int scrollY, int oldScrollX, int oldScrollY) {}
});
我已经上网了,找不到解决方法。
答案 0 :(得分:0)
为此,您将必须编写自定义视图,以扩展NestedScrollView,并在该视图中覆盖onScrollChange()方法并在该方法内添加日志以获取滚动值,您将在编写自定义视图时无法将日志添加到系统小部件。
答案 1 :(得分:0)
选项1(使用ScrollChangeListener)
一个选择可能是在scrollY
中存储和比较oldScrollY
和scrollChangeListener
的值。这样简单的方法可能会起作用(尽管尚未经过正式测试):
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
的值。在我的代码中,需要以编程方式滚动到适配器类中的最后一个可见位置后,使recyclerView
可见,而又不覆盖主类中的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);
}
*或多或少-必须考虑生命周期,但这与具体情况无关