Google的自己的刷新方法SwipeRefreshLayout

SwipeRefreshLayout是Google的亲儿子,也就是原生的刷新,但是它只支持下拉刷新不支持上啦加载更多,今天小弟不才自己添加了一个上啦加载的方法希望给用到的人给予参考鉴赏,话不多说直接开启……

一、首先先来说下SwipeRefreshLayout的一个常用方法:

、isRefreshing() 判断当前的状态是否是刷新状态。

、setColorSchemeResources(int... colorResIds)设置下拉进度条的颜色主题。

、setOnRefreshListener(SwipeRefreshLayout.OnRefreshListener listener)设置监听,需要重写onRefresh()方法,顶部下拉时会调用这个方法,在里面实现你要实现的业务逻辑即可。

、setProgressBackgroundColorSchemeResource(int colorRes)设置下拉进度条的背景颜色。

、setRefreshing(boolean refreshing)设置刷新状态,true表示正在刷新,false表示取消刷新。 自动刷新

二、说完常用方法了,说下SwipeRefreshLayout的基本使用,其实SwipeRefreshLayout的使用非常简单,PS:

	<android.support.v4.widget.SwipeRefreshLayout
   		 android:id="@+id/swipeRefresh"
    		 android:layout_width="match_parent"
  	 	 android:layout_height="wrap_content">

            	<ListView
                	android:id="@+id/new_listView"
                	android:layout_width="match_parent"
               		android:layout_height="wrap_content"
               	 	android:divider="@color/gray"
               	 	android:dividerHeight="1px"/>

	</android.support.v4.widget.SwipeRefreshLayout>
官方文档已经说明SwipeRefreshLayout只能有一个孩子,所以使用的时候一定注意方式。

swipeRefresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
       
     	//这里是主线程一些比较耗时的操作比如联网获取数据,需要放到子线程中去执行
 	//这里也可以直接请求
}});

这样就可以简单的实现下拉刷新了

三、我们来说下上啦加载更多的功能:

这里我们就得自定义上拉加载更多的布局了,定义一个view集成SwipeRefreshLayout从而实现上拉加载

我们在定义的RefreshListView中onLayout中先获取listview的控件

@Override
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {
    super.onLayout(changed, left, top, right, bottom);

    // 初始化ListView对象
    if (mListView == null) {
        getListView();
    }
}

然后再获取listview的对象并且设置滚动监听

/**
 * 获取ListView对象
 */
private void getListView() {
    int childs = getChildCount();
    if (childs > 0) {
        View childView = getChildAt(0);
        if (childView instanceof ListView) {
            mListView = (ListView) childView;
            // 设置滚动监听器给ListView, 使得滚动的情况下也可以自动加载
            mListView.setOnScrollListener(this);
            Log.d(VIEW_LOG_TAG, "### 找到listview");
        }
    }
}

接着再处理下事件分发

@Override
public boolean dispatchTouchEvent(MotionEvent event) {
    final int action = event.getAction();

    switch (action) {
        case MotionEvent.ACTION_DOWN:
            // 按下
            mYDown = (int) event.getRawY();
            break;

        case MotionEvent.ACTION_MOVE:
            // 移动
            mLastY = (int) event.getRawY();
            break;

        case MotionEvent.ACTION_UP:
            // 抬起
            if (canLoad()) {
                loadData();
            }
            break;
        default:
            break;
    }

    return super.dispatchTouchEvent(event);
}

最后就是进行判断从而实现它的加载数据了


/**
 * 是否可以加载更多, 条件是到了最底部, listview不在加载中, 且为上拉操作.
 * 
 * @return
 */
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;
}

/**
 * 是否是上拉操作
 * 
 * @return
 */
private boolean isPullUp() {
    return (mYDown - mLastY) >= mTouchSlop;
}

/**
 * 如果到了最底部,而且是上拉操作.那么执行onLoad方法
 */
private void loadData() {
    if (mOnLoadListener != null) {
        // 设置状态
        setLoading(true);
        //
        mOnLoadListener.onLoad();
    }
}

/**
 * @param loading
 */
public void setLoading(boolean loading) {
    isLoading = loading;
    if (isLoading) {
        mListView.addFooterView(mListViewFooter);
    } else {
        mListView.removeFooterView(mListViewFooter);
        mYDown = 0;
        mLastY = 0;
    }
}



!收尾,这里就是在布局中如何使用

   <com.handmark.pulltorefresh.library.RefreshListView
        android:id="@+id/pt_listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        >
        <ListView
            android:id="@+id/new_listView"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:divider="@color/gray"
            android:dividerHeight="1px"/>
</com.handmark.pulltorefresh.library.RefreshListView>
  
  
<!--自定义View实现SwipeRefreshLayout,添加上拉加载更多的功能--> <com.pinger.swiperefreshdemo.view.SwipeRefreshView android:id="@+id/srl" android:layout_width="match_parent" android:layout_height="match_parent"> <ListView android:id="@+id/lv" android:layout_width="match_parent" android:layout_height="match_parent"/> </com.pinger.swiperefreshdemo.view.SwipeRefreshView>
作者:PingerOne 链接:http://www.jianshu.com/p/d23b42b6360b 來源:简书 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在代码中使用

// 设置下拉刷新监听器
refresh.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
    @Override
    public void onRefresh() {
        refresh.post(new Runnable() {

            @Override
            public void run() {
                // 更新完后调用该方法结束刷新
                refresh.setRefreshing(false);
            }
        });
    }
});

refresh.setOnLoadListener(this);

这是上拉加载更多

   @Override
    public void onLoad() {
        refresh.postDelayed(new Runnable() {
            @Override
            public void run() {
                 isLoad =  true;
                if (number<6) {
                    number++;
                    for (int i = 0; i < 6; i++) {
                        DepositAccount depositAccount = new DepositAccount();
                        depositAccount.setName("上拉加载704195"+number);
                        depositAccount.setCount(2009.66);
                        depositAccount.setTime("2017-4-20 09:00");
                        depositAccount.setEndTime("2017-05-20");
                        listDepositAccount.add(depositAccount);
                    }
                }else{
                    textFooterView.setText("数据已加载完毕");
//                    listivew.removeFooterView(textFooterView);
                }

                depositAdapter.notifyDataSetChanged();
                // 加载完后调用该方法
                refresh.setLoading(false);
            }
        }, 1500);

总的来说这么多了,上班期间写的不好还望大家海涵,总体思路也就是这样了这里只供参考希望能给用到的人一些帮助。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值