xiasuhuei321想看的Android专题Android开发技术中心UI

Android-各种情况下的『自动加载更多』

2016-08-31  本文已影响2210人  c37d344afd22

在写项目的时候总是会碰到上拉自动加载更多这个需求,但是又不想用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

上一篇下一篇

猜你喜欢

热点阅读