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

作者: c37d344afd22 | 来源:发表于2016-08-31 01:06 被阅读2210次

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

    相关文章

      网友评论

      本文标题:Android-各种情况下的『自动加载更多』

      本文链接:https://www.haomeiwen.com/subject/zcsqettx.html