onScrollChanged 在 scrollView 中多次触发滚动结束
onScrollChanged firing multiple times for scroll end in scrollView
我已经实现了一个侦听器 class 来检测引用 link https://gist.github.com/marteinn/9427072
的滚动视图的结尾
public class ResponsiveScrollView extends ScrollView {
private OnBottomReachedListener listener;
public ResponsiveScrollView(Context context) {
super(context);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
View view = getChildAt(getChildCount()-1);
int diff = view.getBottom()-(getHeight()+getScrollY());
if (diff == 0 && listener!= null) {
listener.onBottomReached(this);
}
super.onScrollChanged(l, t, oldl, oldt);
}
public OnBottomReachedListener getBottomChangedListener() {
return listener;
}
public void setBottomReachesListener(OnBottomReachedListener onBottomReachedListener) {
this.listener = onBottomReachedListener;
}
public interface OnBottomReachedListener {
public void onBottomReached(View view);
}
}
侦听器设置为滚动视图:
scrollView.setBottomReachesListener(new GenericScrollListerner(this));
我的 GenericScrollListerner class:
public class GenericScrollListerner implements ResponsiveScrollView.OnBottomReachedListener {
private Context mContext;
public GenericScrollListerner(Context context) {
this.mContext = context;
}
@Override
public void onBottomReached(View view) {
Log.d("ScrollView","Scroll end");
String tag = (String) view.getTag();
Toast.makeText(mContext, "Scroll end with tag" +tag, Toast.LENGTH_SHORT).show();
}
}
我的问题是 onBottomReached 大多数时候触发两次。如何处理这个问题???
这是由于过度滚动造成的。请在 scrollview xml declaration
中添加以下行
android:overScrollMode="never"
如果问题仍然存在,请使用以下调整
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
View view = getChildAt(getChildCount() - 1);
int diff = view.getBottom() - (getHeight() + getScrollY());
if (diff == 0 && listener != null && !stopTwice) {
stopTwice=true;
listener.onBottomReached(this);
}else{
stopTwice=false;
}
super.onScrollChanged(l, t, oldl, oldt);
}
最后,我找到了一个没有调整的答案。
使用 'NestedScrollView' 而不是 ScrollView
扩展自定义滚动视图
public class ResponsiveScrollView extends NestedScrollView {
private OnBottomReachedListener listener;
public ResponsiveScrollView(Context context) {
super(context);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
View view = getChildAt(getChildCount()-1);
int diff = view.getBottom()-(getHeight()+getScrollY());
if (diff == 0 && listener!= null) {
listener.onBottomReached(this);
}
super.onScrollChanged(l, t, oldl, oldt);
}
public OnBottomReachedListener getBottomChangedListener() {
return listener;
}
public void setBottomReachesListener(OnBottomReachedListener onBottomReachedListener) {
this.listener = onBottomReachedListener;
}
public interface OnBottomReachedListener {
public void onBottomReached(View view);
}
}
上面的代码可以工作
我已经实现了一个侦听器 class 来检测引用 link https://gist.github.com/marteinn/9427072
的滚动视图的结尾public class ResponsiveScrollView extends ScrollView {
private OnBottomReachedListener listener;
public ResponsiveScrollView(Context context) {
super(context);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
View view = getChildAt(getChildCount()-1);
int diff = view.getBottom()-(getHeight()+getScrollY());
if (diff == 0 && listener!= null) {
listener.onBottomReached(this);
}
super.onScrollChanged(l, t, oldl, oldt);
}
public OnBottomReachedListener getBottomChangedListener() {
return listener;
}
public void setBottomReachesListener(OnBottomReachedListener onBottomReachedListener) {
this.listener = onBottomReachedListener;
}
public interface OnBottomReachedListener {
public void onBottomReached(View view);
}
}
侦听器设置为滚动视图:
scrollView.setBottomReachesListener(new GenericScrollListerner(this));
我的 GenericScrollListerner class:
public class GenericScrollListerner implements ResponsiveScrollView.OnBottomReachedListener {
private Context mContext;
public GenericScrollListerner(Context context) {
this.mContext = context;
}
@Override
public void onBottomReached(View view) {
Log.d("ScrollView","Scroll end");
String tag = (String) view.getTag();
Toast.makeText(mContext, "Scroll end with tag" +tag, Toast.LENGTH_SHORT).show();
}
}
我的问题是 onBottomReached 大多数时候触发两次。如何处理这个问题???
这是由于过度滚动造成的。请在 scrollview xml declaration
中添加以下行android:overScrollMode="never"
如果问题仍然存在,请使用以下调整
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
View view = getChildAt(getChildCount() - 1);
int diff = view.getBottom() - (getHeight() + getScrollY());
if (diff == 0 && listener != null && !stopTwice) {
stopTwice=true;
listener.onBottomReached(this);
}else{
stopTwice=false;
}
super.onScrollChanged(l, t, oldl, oldt);
}
最后,我找到了一个没有调整的答案。
使用 'NestedScrollView' 而不是 ScrollView
扩展自定义滚动视图public class ResponsiveScrollView extends NestedScrollView {
private OnBottomReachedListener listener;
public ResponsiveScrollView(Context context) {
super(context);
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
View view = getChildAt(getChildCount()-1);
int diff = view.getBottom()-(getHeight()+getScrollY());
if (diff == 0 && listener!= null) {
listener.onBottomReached(this);
}
super.onScrollChanged(l, t, oldl, oldt);
}
public OnBottomReachedListener getBottomChangedListener() {
return listener;
}
public void setBottomReachesListener(OnBottomReachedListener onBottomReachedListener) {
this.listener = onBottomReachedListener;
}
public interface OnBottomReachedListener {
public void onBottomReached(View view);
}
}
上面的代码可以工作