美文网首页android 集结号程序员Android开发
ListView的滚动监听--AbsListView.OnScr

ListView的滚动监听--AbsListView.OnScr

作者: i冰点 | 来源:发表于2016-08-12 22:28 被阅读3585次

    1、知识点

    1、 onScrollStateChanged

    @Overridepublic void onScrollStateChanged(AbsListView view, int scrollState) {}
    

    scrollState有三种状态:

    • SCROLL_STATE_TOUCH_SCROLL:开始滚动的时候调用,调用一次
    • SCROLL_STATE_IDLE:滚动事件结束的时候调用,调用一次
    • SCROLL_STATE_FLING:当手指离开屏幕,并且产生惯性滑动的时候调用,可能会调用<=1次

    在没有做出抛的动作时,只会回调两次

    2、 onScroll

    @Overridepublic void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {}
    

    在滑动屏幕的过程中,onScroll方法会一直调用:

    • firstVisibleItem: 当前屏幕显示的第一个item的位置(下标从0开始)
    • visibleItemCount:当前屏幕可以见到的item总数,包括没有完整显示的item
    • totalItemCount:Item的总数,** 包括通过addFooterView添加的那个item **

    ** 注意:
    在listview的item发生变化的时候(初始化/notifyDataSetChanged()),onScroll会被调用:


    初始化listview的时候,onScroll发生调用

    **

    2、 加载更多

    在onScroll这个方法中,可以通过以上几个参数,判断是否是最后一个item,可以实现加载更多的功能

        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            if(firstVisibleItem+visibleItemCount>=totalItemCount && totalItemCount>0){
                isLastRow=true;
            }else {
                isLastRow=false;
            }
        }
    

    ** ListView的上拉下拉的功能可以通过SwipeRefreshLayout+自定义ListView(OnScrollListener)实现 **,
    见,SwipeRefreshLayout的学习

    代码如下:

    package com.liyi.loadmorelistview;
    
    import android.content.Context;
    import android.util.AttributeSet;
    import android.util.Log;
    import android.view.LayoutInflater;
    import android.view.MotionEvent;
    import android.view.View;
    import android.widget.AbsListView;
    import android.widget.ListView;
    import android.widget.TextView;
    
    public class LoadMoreListView extends ListView implements AbsListView.OnScrollListener {
    
        private Context context;
        private View footerView;
        private boolean isLastRow;
        private boolean isLoading;
        private boolean isError;
        private OnLoadMoreListener loadMoreListener;
    
        public void setOnLoadMoreListener(OnLoadMoreListener loadMoreListener){
            this.loadMoreListener=loadMoreListener;
        }
    
        public  interface OnLoadMoreListener{
            void loadMore();
        }
    
        public LoadMoreListView(Context context) {
            this(context,null);
        }
    
        public LoadMoreListView(Context context, AttributeSet attrs) {
            this(context, attrs,0);
        }
    
        public LoadMoreListView(Context context, AttributeSet attrs, int defStyleAttr) {
            super(context, attrs, defStyleAttr);
            this.context=context;
            init();
        }
    
        private void init() {
            footerView= LayoutInflater.from(context).inflate(R.layout.layout_footer,this,false);
            this.addFooterView(footerView);
            ( (footerView.findViewById(R.id.footerTextView))).setOnClickListener(new OnClickListener() {
                @Override
                public void onClick(View v) {
                    if(isError){
                        showLoading("正在加载");
                        isLoading=true;
                        loadMoreListener.loadMore();
                        isError=false;
                    }
                }
            });
            setOnScrollListener(this);
        }
    
        @Override
        public void onScrollStateChanged(AbsListView view, int scrollState) {
            Log.i("loadMore","onScrollStateChanged:"+scrollState+",isLastRow"+isLastRow);
            if(scrollState==SCROLL_STATE_IDLE){
                if(isLastRow && !isLoading){
                    showLoading("正在加载");
                    isLoading=true;
                    loadMoreListener.loadMore();
                }
            }
        }
    
        @Override
        public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {
            Log.i("loadMore","onScroll"+"firstVisibleItem:"+firstVisibleItem+",visibleItemCount:"+visibleItemCount+",totalItemCount:"+totalItemCount);
            if(firstVisibleItem+visibleItemCount>=totalItemCount && totalItemCount>0){
                isLastRow=true;
            }else {
                isLastRow=false;
            }
        }
    
        private void showLoading(String msg) {
            footerView.findViewById(R.id.progressBar).setVisibility(View.VISIBLE);
            ((TextView) (footerView.findViewById(R.id.footerTextView))) .setText(msg);
        }
    
        private void hiddenLoading(String msg) {
            footerView.findViewById(R.id.progressBar).setVisibility(View.GONE);
            ((TextView) (footerView.findViewById(R.id.footerTextView))) .setText(msg);
        }
    
        public void loadComplete(){
            Log.i("loadMore","loadComplete"+",isLastRow"+isLastRow);
            isError=false;
            isLoading=false;
            isLastRow=false;
            hiddenLoading("-- end --");
        }
    
        public void loadError(){
            isLoading=false;
            isError=true;
            hiddenLoading("加载失败,点击重新加载");
    
        }
    
    }
    
    
    
    正在 加载 加载失败 没有数据了

    代码 下载

    相关文章

      网友评论

        本文标题:ListView的滚动监听--AbsListView.OnScr

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