下拉刷新,上拉加载

来源:互联网 发布:淘宝美工必备软件 编辑:程序博客网 时间:2024/05/17 09:36

下拉刷新:
下拉刷新是SwipeRefreshLayout自带的,主要要设置setOnRefreshListener的方法
例如:

//设置下拉刷新事件        myRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {            @Override            public void onRefresh() {                Toast.makeText(Activity_swipe.this, "refresh", Toast.LENGTH_SHORT).show();                myRefreshLayout.postDelayed(new Runnable() {                    @Override                    public void run() {                        datas.add(new Date().toGMTString());                        adapter.notifyDataSetChanged();                        //更新完后调用该方法结束刷新                        myRefreshLayout.setRefreshing(false);                    }                }, 1000);            }        });

这样,下拉的时候就会调用onRefresh的方法,可以在PostDelay中执行耗时操作

下拉加载:
两个要点:
1、监听滑动手势
2、确实手势后改变数据然后提醒更新
以下代码主要实现了手势的监听和初始化了一个ListView:

public class RefreshLayout extends SwipeRefreshLayout implements AbsListView.OnScrollListener {    private int mTouchSlop;    private ListView mListView;    private OnLoadListener mOnLoadListener;    private View mListViewFooter;//    按下是的Y坐标    private int mYDown;//    抬起时的Y坐标,与mYDown一起用于滑动到底部时判断是上拉还是下拉    private int mLastY;    private boolean isloading = false;    public RefreshLayout(Context context, AttributeSet attrs) {        super(context, attrs);        mTouchSlop = ViewConfiguration.get(context).getScaledTouchSlop();        mListViewFooter = LayoutInflater.from(context).inflate(R.layout.listview_footer, null, false);    }    public RefreshLayout(Context context) {        this(context, null);    }    @Override    protected void onLayout(boolean changed, int left, int top, int right, int bottom) {        super.onLayout(changed, left, top, right, bottom);        if(mListView == null)        {            getListView();        }    }    private void getListView()    {        int childs = getChildCount();        if(childs > 0)        {            View childView = getChildAt(0);            if(childView instanceof ListView)            {                mListView = (ListView)childView;//                设置滚动监听器给Listview,使得滚动的清华下也可以自动加载                mListView.setOnScrollListener(this);            }        }    }    @Override    public boolean dispatchTouchEvent(MotionEvent ev) {        final int action = ev.getAction();        switch (action)        {            case MotionEvent.ACTION_DOWN:                //按下                mYDown = (int) ev.getRawY();                break;            case MotionEvent.ACTION_MOVE:                //移动                mLastY = (int) ev.getRawY();                break;            case MotionEvent.ACTION_UP:                //抬起                if(canLoad())                {                    loadData();                }                break;            default:                break;        }        return super.dispatchTouchEvent(ev);    }    private boolean canLoad()    {        return isBottom() && !isloading && isPullUp();    }    private boolean isBottom()    {        if(mListView != null && mListView.getAdapter() != null)        {            return mListView.getLastVisiblePosition() ==                    (mListView.getAdapter().getCount() - 1);        }        return false;    }    private boolean isPullUp()    {        return (mYDown - mLastY) >= mTouchSlop;    }    private void loadData()    {        if(mOnLoadListener != null)        {            //设置状态            setLoading(true);            //            mOnLoadListener.onLoad();        }    }    public void setLoading(boolean loading)    {        isloading = loading;        if(isloading)        {            mListView.addFooterView(mListViewFooter);        }        else        {            mListView.removeFooterView(mListViewFooter);            mYDown = 0;            mLastY = 0;        }    }    public void setOnLoadListener(OnLoadListener loadListener)    {        mOnLoadListener = loadListener;    }    @Override    public void onScrollStateChanged(AbsListView view, int scrollState) {    }    @Override    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {        if(canLoad())        {            loadData();        }    }    public static interface OnLoadListener{        public void onLoad();    }}

然后在使用该自定义view的Activity里设置更新数据的事件:

myRefreshLayout.setOnLoadListener(new RefreshLayout.OnLoadListener() {            @Override            public void onLoad() {                Toast.makeText(Activity_swipe.this, "load", Toast.LENGTH_SHORT).show();                myRefreshLayout.postDelayed(new Runnable() {                    @Override                    public void run() {                        datas.add(new Date().toGMTString());                        adapter.notifyDataSetChanged();                        myRefreshLayout.setLoading(false);                    }                }, 1500);            }        });

大概这样就能实现下拉刷新,上拉加载了

0 0