-
-
Save marteinn/9427072 to your computer and use it in GitHub Desktop.
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(); | |
} | |
} |
I encountered a problem. ie, Sometimes OnBottomReached is firing multiple times. Anyone has the same problem ???? Please help me to solve this
I encountered a problem. ie, Sometimes OnBottomReached is firing multiple times. Anyone has the same problem ???? Please help me to solve this
How do i use it/call it from main Activity...help me i am having trouble ???
@marteinn Under which license do you publish this?
@Croydon MIT. Will clarify in the description.
One-liner in Kotlin:
fun ViewGroup.isScrolledToBottom() = getChildAt(childCount - 1).bottom - height - scrollY == 0
good, it's work
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.
@alcntml thanks for your snippet. I've posted a modified version of yours here, IMO the scroll up and down were switched. Also made the 'bottom' detection a tad bit forgiving 😁