android的SwipeRefreshLayout 扩展

最近在用SwipeRefreshLayout   发现没有 上拉加载功能 ,自己 闲暇之余 谢了一个上拉刷新, 话不多说上代码了希望对大家有所帮助!

package com.baicheng.baic.refreshview;


import com.baicheng.baic.R;


import android.content.Context;
import android.support.v4.widget.SwipeRefreshLayout;
import android.util.AttributeSet;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewConfiguration;
import android.widget.AbsListView;
import android.widget.AbsListView.OnScrollListener;
import android.widget.ListView;


/**
 * 
 * @author Mr.张
 * 
 */
public class RefreshLayout extends SwipeRefreshLayout implements
		OnScrollListener {
	/**
	 * 滑动到最底部的上拉操作
	 */
	private int mTouchSlop;
	/**
	 * 
	 * listView 实例
	 */


	private ListView mListView;


	/**
	 * 到了最底部的上拉 加载操作
	 */
	private OnLoadListener mOnLoadListener;
	/**
	 * ListView 的footView
	 */
	private View mListViewfooter;
	/**
	 * 按下时Y的坐标
	 */
	private int mDownY;
	/**
	 * 抬起时的y坐标, 与mYDown一起用于滑动到底部时判断是上拉还是下拉
	 */
	private int mLastY;
	/**
	 * 是否在加载中 ( 上拉加载更多 )
	 */
	private boolean isLoading = false;


	public RefreshLayout(Context context) {
		this(context, null);
		// TODO Auto-generated constructor stub
	}


	public RefreshLayout(Context context, AttributeSet attrs) {
		super(context, attrs);
		// TODO Auto-generated constructor stub
		mTouchSlop = ViewConfiguration.get(context).getScaledDoubleTapSlop();
		mListViewfooter = LayoutInflater.from(context).inflate(
				R.layout.newlistview_footer, null, false);
	}


	@Override
	protected void onLayout(boolean changed, int left, int top, int right,
			int bottom) {
		// TODO Auto-generated method stub
		super.onLayout(changed, left, top, right, bottom);
		// 初始化listView
		if (mListView == null) {


		}
	}


	public 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) {
		// TODO Auto-generated method stub
		final int action = ev.getAction();
		switch (action) {
		case MotionEvent.ACTION_DOWN:
			mDownY = (int) ev.getRawY();
			break;
		case MotionEvent.ACTION_MOVE:
			mLastY = (int) ev.getRawY();
			break;
		case MotionEvent.ACTION_UP:
			if (mCanLoad()) {


				loadData();
			}
			break; 
		default:
			break;
		}


		return super.dispatchTouchEvent(ev);
	}


	/**
	 * 判断是否到了底部
	 */


	private boolean isBotton() {
		if (mListView != null && mListView.getAdapter() != null) {


			return mListView.getLastVisiblePosition() == (mListView
					.getAdapter().getCount() - 1);
		}


		return false;
	}


	/**
	 * 是否为上拉操作
	 */
	public boolean isPullUp() {


		return (mDownY - mLastY) >= mTouchSlop;


	}


	/**
	 * 是否可以加载更多, 条件是到了最底部, listview不在加载中, 且为上拉操作.
	 * 
	 * @return
	 */
	private boolean mCanLoad() {


		return isBotton() && isPullUp() && !isLoading;


	}


	/**
	 * 如果到了底部而且是上拉操作执行loadData
	 */
	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);
			mLastY = 0;
			mDownY = 0;


		}


	}


	/**
	 * @param loadListener
	 */
	public void setOnLoadListener(OnLoadListener loadListener) {
		mOnLoadListener = loadListener;
	}


	@Override
	public void onScrollStateChanged(AbsListView view, int scrollState) {
		// TODO Auto-generated method stub


	}


	@Override
	public void onScroll(AbsListView view, int firstVisibleItem,
			int visibleItemCount, int totalItemCount) {
		// TODO Auto-generated method stub
		if (mCanLoad()) {


			loadData();


		}
	}


	/**
	 * 加载更多的监听器
	 * 
	 * @author mrsimple
	 */
	public static interface OnLoadListener {
		public void onLoad();
	}



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值