Android-各种情况下的『自动加载更多』
在写项目的时候总是会碰到上拉自动加载更多这个需求,但是又不想用PullToRefresh,其实我们可以直接判断出来是否已经滑动到底端,如果滑动到底端则加载。一般的需求有在ScrollView、RecyclerView、ListView中自动加载
RecyclerView
在RecyclerView中判断是否滑动到底部,其实就是判断是否已经达到了最后一个可见的item && 滑动结束,伪代码如下
RecyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
if (newState == RecyclerView.SCROLL_STATE_IDLE &&
(layoutManager.findLastVisibleItemPosition() ==
layoutManager.getItemCount() - 1)
&& !isRefreshing) {
isRefreshing = true;
//处理逻辑
}
}
});
解释一下上面的判断,当状态为SCROLL_STATE_IDLE(停止滑动)时,并且目前可见的最后一个item的位置为总数-1,并且当前不在刷新状态中(因为有的时候需要网络请求,所以可能滑动到底部后一直请求接口,定义一个变量来判断一下),然后就可以处理逻辑了
ListView
关于ListView的滑动底部监听其实和RecyclerView的判断差不多,代码如下:
ListView.setOnScrollListener(new OnScrollListener() {
@Override
public void onScrollStateChanged(AbsListView view, int scrollState) {
if((scrollState == OnScrollListener.SCROLL_STATE_IDLE) &&
view.getLastVisiblePosition() == (view.getCount() - 1)
&& !isRefreshing) {
//处理逻辑
}
}
}
@Override
public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {
}
});
ListView和RecyclerView差不多,就不多做解释了
ScrollView
最后关于ScrollView滑动到底部,因为ScrollView没有停止滑动的监听,所以使用要慎重!
如果想要使用ScrollView来监听,那就要重写ScrollView,代码如下:
onScrollBottomListener bottomListener;
public void setOnScrollBottomListener(onScrollBottomListener bottomListener){
this.bottomListener = bottomListener;
}
public interface onScrollBottomListener{
void onBottom();
}
@Override
protected void onScrollChanged(int l, int t, int oldl, int oldt) {
super.onScrollChanged(l, t, oldl, oldt);
if(getHeight() + getScrollY() >= getChildAt(0).getMeasureHeight()){
if(bottomListener != null){
bottomListener.onBottom();
}
}
}
看的出来,我们定义了一个接口来回调,因为ScrollView里只能包含一个布局,所以可以根据这个特性来判断,所以在滑动事件监听里获取到当前ScrollView的高度和Y轴的滑动值的相加来和ScrollView包含的布局的高度来进行对比,如果大于的话那么就等于滑动到底部(但是这个方法会调用好多次)
以前工作的时候碰到过这些需求,当时在网上找也没有找到合适的(确实当时技术很菜),过了好久了,分享出来,希望后来又有需求的少碰坑- -
当然可以在布局的后面加一个FooterView,加载数据的时候显示『正在加载...』,加载到没有数据的时候显示一个『- end -』之类的
没写Demo,有兴趣的可以自己试试啦~
洗洗睡了,凌晨1:05
最后
爱生活,爱小丽,爱Android