Last active
May 2, 2023 22:35
-
-
Save marteinn/9427072 to your computer and use it in GitHub Desktop.
ScrollView with a OnBottomReachedListener for Android. MIT license (https://opensource.org/licenses/MIT).
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
package se.marteinn.ui; | |
import android.content.Context; | |
import android.util.AttributeSet; | |
import android.view.View; | |
import android.widget.ScrollView; | |
/** | |
* Triggers a event when scrolling reaches bottom. | |
* | |
* Created by martinsandstrom on 2010-05-12. | |
* Updated by martinsandstrom on 2014-07-22. | |
* | |
* Usage: | |
* | |
* scrollView.setOnBottomReachedListener( | |
* new InteractiveScrollView.OnBottomReachedListener() { | |
* @Override | |
* public void onBottomReached() { | |
* // do something | |
* } | |
* } | |
* ); | |
* | |
* | |
* Include in layout: | |
* | |
* <se.marteinn.ui.InteractiveScrollView | |
* android:layout_width="match_parent" | |
* android:layout_height="match_parent" /> | |
* | |
*/ | |
public class InteractiveScrollView extends ScrollView { | |
OnBottomReachedListener mListener; | |
public InteractiveScrollView(Context context, AttributeSet attrs, | |
int defStyle) { | |
super(context, attrs, defStyle); | |
} | |
public InteractiveScrollView(Context context, AttributeSet attrs) { | |
super(context, attrs); | |
} | |
public InteractiveScrollView(Context context) { | |
super(context); | |
} | |
@Override | |
protected void onScrollChanged(int l, int t, int oldl, int oldt) { | |
View view = (View) getChildAt(getChildCount()-1); | |
int diff = (view.getBottom()-(getHeight()+getScrollY())); | |
if (diff == 0 && mListener != null) { | |
mListener.onBottomReached(); | |
} | |
super.onScrollChanged(l, t, oldl, oldt); | |
} | |
// Getters & Setters | |
public OnBottomReachedListener getOnBottomReachedListener() { | |
return mListener; | |
} | |
public void setOnBottomReachedListener( | |
OnBottomReachedListener onBottomReachedListener) { | |
mListener = onBottomReachedListener; | |
} | |
/** | |
* Event listener. | |
*/ | |
public interface OnBottomReachedListener{ | |
public void onBottomReached(); | |
} | |
} |
topReach is fired multiple times
fixed version
public class MyScrollView extends ScrollView {
OnBottomReachedListener mListener;
private boolean bottomreached = false;
public MyStickyScrollView(Context context, AttributeSet attrs,
int defStyle) {
super(context, attrs, defStyle);
}
public MyStickyScrollView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MyStickyScrollView(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 && mListener != null && !bottomreached) {
mListener.onBottomReached();
bottomreached = true;
}
else {
bottomreached = false;
}
super.onScrollChanged(l, t, oldl, oldt);
}
// Getters & Setters
public OnBottomReachedListener getOnBottomReachedListener() {
return mListener;
}
public void setOnBottomReachedListener(
OnBottomReachedListener onBottomReachedListener) {
mListener = onBottomReachedListener;
}
/**
* Event listener.
*/
public interface OnBottomReachedListener{
void onBottomReached();
}
}
only fires 1 time
diff ==0
is dangerous because it may never hit 0
as of various brand screen configurations. diff <= 0
is kinda useless because it's gonna trigger top/bottomReached
multiple times.
So far, great thanks for your work, works just as expected.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
good, it's work