下拉刷新:
下拉刷新是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);
}
});
大概这样就能实现下拉刷新,上拉加载了