下拉刷新,上拉加载

下拉刷新:
下拉刷新是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
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值