0 0

如何判断ScrollView滑动到最底部?10

ListView可以添加监听器OnScrollListener来判断是否缓动到了底部。
但是ScrollView没有该功能,那如何判断呢?求教中。。。

我要做的效果是:当ScrollView滑动到最底部时需要请求下一页的数据。

问题补充:
Rainbow702 写道
调用函数判断如下:
if(getScrollY() + getHeight() >=  computeVerticalScrollRange())
{
        Log.d(TAG,"------滚动到最下方------");
}
else
{
        Log.d(TAG,"没有到最下方");
}

我因该放在哪个事件中判断呢?
我滑动后直到ScrollView停止,而ScrollView没有滑动停止监听功能的,感觉沒地方写。阁下是如何处理的?

问题补充:
Rainbow702 写道
给你找了个示例,上面写得很全:
http://disanji.net/2011/02/19/solve-viewflipper-scrollview-flip-problem/

我以前想实现的功能是,让 ScroolView 滚动至最下面,直接使用类中的 fullScroll() 方法就可以的。

scrollView.fullScroll(View.FOCUS_DOWN)的话是自动滚到最底部吧,还有scrollView.computeVerticalScrollRange()这个方法是Protected的,不是public的,我引用不到。呵呵

问题补充:ListView可以添加监听器OnScrollListener来判断是否缓动到了底部。
但是ScrollView没有该功能,也就是说ScrollView.setOnScrollListener()是不可以的!

问题补充:好像if(scrollView.getScrollY() + scrollView.getHeight() >=  scrollView.computeVerticalScrollRange())不对的嘛。
我打印出来:
scrollView.getHeight()是固定值410
crollView.computeVerticalScrollRange()也是固定值320
这样的话无论如何条件都是成立的。

问题补充:我加了GestureDetector可以无视,主要看public int computeVerticalScrollRange()
public class MyScrollView extends ScrollView {

	GestureDetector gestureDetector;
	
	public MyScrollView(Context context) {
		super(context);
		// TODO Auto-generated constructor stub
	}
	public MyScrollView(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
	}
	public MyScrollView(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
		// TODO Auto-generated constructor stub
	}
	
	public int computeVerticalScrollRange(){
		return super.computeHorizontalScrollRange();
	}
	public int computeVerticalScrollOffset(){
		return super.computeVerticalScrollOffset();
	}
	public void setGestureDetector(GestureDetector gestureDetector) {
		this.gestureDetector = gestureDetector;
	}
 
	@Override
	public boolean onTouchEvent(MotionEvent event) {
	    super.onTouchEvent(event);
	    return gestureDetector.onTouchEvent(event);
	}
 
	@Override
	public boolean dispatchTouchEvent(MotionEvent ev){
	    gestureDetector.onTouchEvent(ev);
	    super.dispatchTouchEvent(ev);
	    return true;
	} 

问题补充:
scrollViewListener是OnScrollChangedListener对象?它没有onScrollChanged(this, x, y, oldx, oldy);方法的啊。
如果是OnScrollListener对象也没有该方法的!

问题补充:给个具体的类吧,你说的那个scrollViewListener到底什么对象?

问题补充:我看了上面一位仁兄的:
@Override 
    protected void onScrollChanged(int x, int y, int oldx, int oldy) { 
        super.onScrollChanged(x, y, oldx, oldy); 
        if (scrollViewListener != null) { 
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy); 
        } 
    } 
但是scrollViewListener是什么对象?不是OnScrollListener,也不是OnScrollChangedListener对象,怪怪。

问题补充:试了,这样的话肯定变化了

问题补充:不对,我发现还是320!

我滚动到最底部,打印的数据为:
getScrollY()=590
getHeight()=410
computeVerticalScrollRange()=320

我感觉 if(getScrollY() + getHeight() >=  computeVerticalScrollRange())
三者之间的关系有问题。
2011年9月01日 09:47

10个答案 按时间排序 按投票排序

0 0

采纳的答案

调用函数判断如下:

if(getScrollY() + getHeight() >=  computeVerticalScrollRange())
{
        Log.d(TAG,"------滚动到最下方------");
}
else
{
        Log.d(TAG,"没有到最下方");
}

2011年9月01日 09:53
0 0

的确,我看他的 scrollView.setScrollViewListener(this)  ,然后去找  setScrollViewListener() 这个方法,也没找到。
PS:我上面提的那个建议不知道你有没有试过

引用
所以,你试着在你的scrollView上多加几个组件(如果你是在ScrollView中嵌入了一个TextView的话,那就在其中输入一些字符),看看返回值还是不是你说的 320?

2011年9月01日 17:58
0 0

引用
它没有onScrollChanged(this, x, y, oldx, oldy);方法的啊

onScrollChanged() 方法是 View() 类里的,ScrollView 应该是继承了这个方法

2011年9月01日 17:48
0 0

引用

protected int computeVerticalScrollRange ()

The scroll range of a scroll view is the overall height of all of its children.
Returns
    the total vertical range represented by the vertical scrollbar. The default range is the drawing height of this view.

上面是这个API的说明,第一句说明了这个方法的返回值应该是所有子组件的高度的和。所以,你试着在你的scrollView上多加几个组件(如果你是在ScrollView中嵌入了一个TextView的话,那就在其中输入一些字符),看看返回值还是不是你说的 320?

2011年9月01日 16:10
0 0

晕之前看错了
继承scrollview的时候
滚动时候的监听
 @Override
    protected void onScrollChanged(int x, int y, int oldx, int oldy) {
        super.onScrollChanged(x, y, oldx, oldy);
        if (scrollViewListener != null) {
            scrollViewListener.onScrollChanged(this, x, y, oldx, oldy);
        }
    }
     //这个获得总的高度
    public int getTotalVerticalScrollRange() {
        return computeVerticalScrollRange();
    activity的时候
  scrollView.setScrollViewListener(this)
在这个监听的过程中 当中 getScrollY()=getTotalVerticalScrollRange()这样用该就是到底部了。


2011年9月01日 15:50
0 0

引用

scrollView.getHeight()是固定值410
crollView.computeVerticalScrollRange()也是固定值320

这个不会吧,你把你继续自 ScrollView 的类的代码贴个出来看看呢

2011年9月01日 13:41
0 0

scrollView.computeVerticalScrollRange()这个方法是Protected的,不是public的,我引用不到。
对,这个比较恶心。不过,还是有办法的,你可以创建一个类继承ScrollView, 新建一个方法,把这个方法设置成public的,在里面调用computeVerticalScrollRange(), 一切问题都解决了。

2011年9月01日 11:13
0 0

实现原理: 通过手指的滑动,判断数据大小 然后动态改变数据,

firstVisbleItem 第一个可见的item visibleItemCount 可见的Item个数 totalItemCount 总的个数
	 * lastItem 可见状态中,最后一个item


	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {


	lastItem = firstVisibleItem + visibleItemCount - 1;
}
/**
	 * 如果视图正在滚动,此方法将被调用之前,滚动下一帧呈现。特别是,它会被调用之前调用getView
	 */
	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		if (lastItem == adapter.getCount()
				&& scrollState == OnScrollListener.SCROLL_STATE_IDLE) {
			nowpage++;
		。。。。。。
			adapter.notifyDataSetChanged();
		}
	}

2011年9月01日 10:50
0 0

给你找了个示例,上面写得很全:
http://disanji.net/2011/02/19/solve-viewflipper-scrollview-flip-problem/

我以前想实现的功能是,让 ScroolView 滚动至最下面,直接使用类中的 fullScroll() 方法就可以的。

2011年9月01日 10:32
0 0

引用
我因该放在哪个事件中判断呢?

你可以定义一个手势响应类来处理响应事件,覆写其 onScroll() 方法,把上面的代码放到其中即可

2011年9月01日 10:30

相关推荐

Global site tag (gtag.js) - Google Analytics