如何判断ScrollView滑动到最底部?
ListView可以添加监听器OnScrollListener来判断是否缓动到了底部。
但是ScrollView没有该功能,那如何判断呢?求教中。。。
我要做的效果是:当ScrollView滑动到最底部时需要请求下一页的数据。
调用函数判断如下:
[code="java"]
if(getScrollY() + getHeight() >= computeVerticalScrollRange())
{
Log.d(TAG,"------滚动到最下方------");
}
else
{
Log.d(TAG,"没有到最下方");
}
[/code]
[quote]我因该放在哪个事件中判断呢? [/quote]
你可以定义一个手势响应类来处理响应事件,覆写其 onScroll() 方法,把上面的代码放到其中即可
给你找了个示例,上面写得很全:
[url]http://disanji.net/2011/02/19/solve-viewflipper-scrollview-flip-problem/[/url]
我以前想实现的功能是,让 ScroolView 滚动至最下面,直接使用类中的 fullScroll() 方法就可以的。
[code="java"]
实现原理: 通过手指的滑动,判断数据大小 然后动态改变数据,
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();
}
}
[/code]
[url]scrollView.computeVerticalScrollRange()这个方法是Protected的,不是public的,我引用不到。[/url]
对,这个比较恶心。不过,还是有办法的,你可以创建一个类继承ScrollView, 新建一个方法,把这个方法设置成public的,在里面调用computeVerticalScrollRange(), 一切问题都解决了。
[quote]
scrollView.getHeight()是固定值410
crollView.computeVerticalScrollRange()也是固定值320
[/quote]
这个不会吧,你把你继续自 ScrollView 的类的代码贴个出来看看呢
[code="java"]
晕之前看错了
继承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()这样用该就是到底部了。
[/code]
[quote]
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.
[/quote]
上面是这个API的说明,第一句说明了这个方法的返回值应该是所有子组件的高度的和。所以,你试着在你的scrollView上多加几个组件(如果你是在ScrollView中嵌入了一个TextView的话,那就在其中输入一些字符),看看返回值还是不是你说的 320?
[quote]它没有onScrollChanged(this, x, y, oldx, oldy);方法的啊[/quote]
onScrollChanged() 方法是 View() 类里的,ScrollView 应该是继承了这个方法
的确,我看他的 scrollView.setScrollViewListener(this) ,然后去找 setScrollViewListener() 这个方法,也没找到。
PS:我上面提的那个建议不知道你有没有试过
[quote]所以,你试着在你的scrollView上多加几个组件(如果你是在ScrollView中嵌入了一个TextView的话,那就在其中输入一些字符),看看返回值还是不是你说的 320? [/quote]