android 集结号程序员Android开发

ListView的滚动监听--AbsListView.OnScr

2016-08-12  本文已影响3585人  i冰点

1、知识点

1、 onScrollStateChanged

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

scrollState有三种状态:

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

2、 onScroll

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

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

** 注意:
在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("加载失败,点击重新加载");

    }

}


正在 加载 加载失败 没有数据了

代码 下载

上一篇下一篇

猜你喜欢

热点阅读