我正在寻找一个能在scrollView上使用的事件,当用户滚动到底部时触发。
例如,我的项目列表应自动扩展更多项目。
有什么想法如何实现这个功能吗?
非常感谢任何提示。
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt)
{
// Grab the last child placed in the ScrollView, we need it to determinate the bottom position.
View view = (View) getChildAt(getChildCount()-1);
// Calculate the scrolldiff
int diff = (view.getBottom()-(getHeight()+getScrollY()));
// if diff is zero, then the bottom has been reached
if( diff == 0 )
{
// notify that we have reached the bottom
Log.d(ScrollTest.LOG_TAG, "MyScrollView: Bottom has been reached" );
}
super.onScrollChanged(l, t, oldl, oldt);
}
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();
}
}
我曾经也遇到过同样的问题,我通过使用ListView(如果需要会自动添加ScrollView)并设置OnScrollListener解决了它。
以下是代码示例:
tableListView.setOnScrollListener(new OnScrollListener() {
public void onScrollStateChanged(AbsListView view, int scrollState) {
}
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
if (visibleItemCount == totalItemCount)
// too little items (ScrollView not needed)
{
java.lang.System.out.println("too little items to use a ScrollView!");
}
else {
if ((firstVisibleItem + visibleItemCount) == totalItemCount) {
// put your stuff here
java.lang.System.out.println("end of the line reached!");
}
}
}
});
如果你使用的是 Android API 21(Android M)以下版本,不要尝试使用 SetOnScrollChangeListener
,可以尝试使用以下方法:
yourScrollView.getViewTreeObserver().addOnScrollChangedListener(new ViewTreeObserver.OnScrollChangedListener() {
@Override
public void onScrollChanged() {
int rootHeight = yourScrollView.getHeight();
int childHeight = yourScrollView.getChildAt(0).getHeight();
int scrollY = yourScrollView.getScrollY();
if(childHeight - rootHeight == scrollY)
Log.d("Hei","You Have Reach The End!");
}
});
虽然这个答案有点晚了,但如果有人碰巧遇到了这个问题,我们可以使用setOnScrollChangeListener来解决。
childScrollView.setOnScrollChangeListener(object : NestedScrollView.OnScrollChangeListener {
override fun onScrollChange(v: NestedScrollView?, scrollX: Int, scrollY: Int, oldScrollX: Int, oldScrollY: Int) {
when {//maxScrollPixelPoint is defined local/global variable
scrollY > maxScrollPixelPoint -> {
maxScrollPixelPoint = scrollY
}
scrollY == maxScrollPixelPoint -> {
//reached bottom
}
}
}
})
if( (recyclerView.computeVerticalScrollOffset() ==
(recyclerView.computeVerticalScrollRange() - recyclerView.getHeight()) ) {
// You have hit rock bottom.
}
直接操作滚动视图的子视图似乎很不专业。